当一个对象需要同步时,如果它没有设置为非最终的,IDE 会抱怨(因为它的引用不是持久的):
private static Object myTable;
....
synchronized(myTable){ //IDE complains!
//access myTable here...
}
我们都知道,如果持有锁的线程更改了非最终对象的引用,IDE 会抱怨阻止另一个线程进入受保护的块。
但是,当线程 A 持有同一对象的锁时,另一个线程 B 是否也可以更改同步对象的引用?
但是,当线程 A 持有同一对象的锁时,另一个线程 B 是否也可以更改同步对象的引用?
如果你的意思是“另一个线程可以改变myTable
变量,答案是“绝对”......假设有一个代码路径允许这样做。它是一个私有变量,因此您应该能够找到可以更改该值的所有代码。
持有锁只会阻止另一个线程获取相同的锁。它本身对哪些代码可以访问哪些变量没有任何影响。
作为旁注,区分object, a variable,以及变量的值(这是一个引用,而不是一个对象)。所以不存在“最终对象”这样的东西——只有变量(以及类和方法)可以是最终的。同样,不存在“同步对象”这样的东西,并且您无法更改“对象的引用” - 您可以更改变量的值,使其成为对不同对象的引用。当你思考这里发生的事情时,在你的脑海中清楚地了解这些区别可能会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)