首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一对象上同步有问题吗?

在同一对象上同步有问题吗?
EN

Stack Overflow用户
提问于 2013-10-09 11:49:29
回答 2查看 39关注 0票数 0

我无法理解slideshare幻灯片15中提到的以下代码

代码语言:javascript
复制
MyObject obj = new MyObject();
    synchronized(obj) {
        obj= new MyObject();
        // no longer synchronizing on the same object
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-10-09 11:58:33

在MyObject obj的第一次声明中,'obj‘对象已被分配给MyObject的一个新实例。

进入同步块,java持有对'obj‘的引用,以便自己用作锁定对象。

在同步块中,您的程序持有的引用已被重新定义为MyObject的另一个新实例。此时,指向MyObject的原始实例的原始引用已经丢失,取而代之的是对MyObject的新实例的引用。

使用'obj‘出现的任何进一步的同步块都将锁定在对象的新实例上,而不是旧实例上,因此不再在同一对象上同步。

为了防止出现这样的问题,我通常会将所有的锁对象都标记为final,以防止意外的重新定义。

票数 2
EN

Stack Overflow用户

发布于 2013-10-09 11:56:18

实际上,在第一行和第二行中,您正在创建MyObject的一个新实例并对其进行同步。

代码语言:javascript
复制
MyObject obj = new MyObject();
    synchronized(obj) {

但问题是,在第三行,您覆盖了obj变量值,并为其分配了一个新MyObject实例的引用。结果是在内存中有两个MyObject实例,但是变量obj只引用最后一个实例(它不是同步的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19262749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档