同步对同一个对象有问题吗?

时间:2013-10-09 03:49:29

标签: java multithreading

我无法理解slideshare

幻灯片15中提到的以下代码
MyObject obj = new MyObject();
    synchronized(obj) {
        obj= new MyObject();
        // no longer synchronizing on the same object
    }
}

2 个答案:

答案 0 :(得分:2)

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

输入同步块,java保存对“obj”的引用,以便将其用作锁定对象。

在同步块内部,程序保存的引用已重新定义为另一个新的MyObject实例。此时,指向MyObject原始实例的原始引用已丢失,并被对MyObject新实例的引用所取代。

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

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

答案 1 :(得分:1)

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

MyObject obj = new MyObject();
    synchronized(obj) {

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