我无法理解slideshare的幻灯片 15 中提到的以下代码
MyObject obj = new MyObject();
synchronized(obj) {
obj= new MyObject();
// no longer synchronizing on the same object
}
}
我无法理解slideshare的幻灯片 15 中提到的以下代码
MyObject obj = new MyObject();
synchronized(obj) {
obj= new MyObject();
// no longer synchronizing on the same object
}
}
在 MyObject obj 的第一个声明中,“obj”对象已分配给 MyObject 的新实例。
进入同步块,java 持有一个对 'obj' 的引用,供自己用作锁定对象。
在同步块内,您的程序持有的引用已重新定义为 MyObject 的另一个新实例。此时,指向 MyObject 原始实例的原始引用已经丢失,取而代之的是对 MyObject 新实例的引用。
使用 'obj' 出现的任何进一步的同步块都将锁定在对象的新实例上,而不是旧实例上,因此不再在同一个对象上同步。
为防止此类问题,我通常将所有锁定对象标记为最终对象,以防止意外重新定义。
实际上,在第一行和第二行中,您正在创建一个新实例MyObject
并对其进行同步。
MyObject obj = new MyObject();
synchronized(obj) {
但问题是,在第三行,您覆盖obj
了变量值,为它分配了一个新实例的引用MyObject
。结果是您MyObject
在内存中有两个实例,但变量obj
仅引用最后一个(未同步)。