当锁持有非最终对象时,该对象的引用是否仍然可以被另一个线程更改?

2023-12-12

当一个对象需要同步时,如果它没有设置为非最终的,IDE 会抱怨(因为它的引用不是持久的):

private static Object myTable;
....

synchronized(myTable){          //IDE complains!
     //access myTable here...
}

我们都知道,如果持有锁的线程更改了非最终对象的引用,IDE 会抱怨阻止另一个线程进入受保护的块。

但是,当线程 A 持有同一对象的锁时,另一个线程 B 是否也可以更改同步对象的引用?


但是,当线程 A 持有同一对象的锁时,另一个线程 B 是否也可以更改同步对象的引用?

如果你的意思是“另一个线程可以改变myTable变量,答案是“绝对”......假设有一个代码路径允许这样做。它是一个私有变量,因此您应该能够找到可以更改该值的所有代码。

持有锁只会阻止另一个线程获取相同的锁。它本身对哪些代码可以访问哪些变量没有任何影响。

作为旁注,区分object, a variable,以及变量的值(这是一个引用,而不是一个对象)。所以不存在“最终对象”这样的东西——只有变量(以及类和方法)可以是最终的。同样,不存在“同步对象”这样的东西,并且您无法更改“对象的引用” - 您可以更改变量的值,使其成为对不同对象的引用。当你思考这里发生的事情时,在你的脑海中清楚地了解这些区别可能会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当锁持有非最终对象时,该对象的引用是否仍然可以被另一个线程更改? 的相关文章

随机推荐