考虑以下代码片段:

 Object bar1  = new ... ;
 Object bar2 = new ... ;


 Object foo = (either bar1 or bar2) ;


现在,在程序的不同时间,foo可以是bar1或bar2。我只是想检查一下synced(foo)是否会锁定相应的bar1或bar2。鉴于未使用Java复制对象,这似乎是最有可能发生的情况。这样对吗?

最佳答案

Object bar1 = new Object();
Object foo = bar1;
synchronized(foo) {
    ...
}


将锁定foo == bar1

但是,这是一个奇怪且容易出错的构造。例如:


线程1到达您的方法,而foo == bar1
线程1到达同步块并锁定在bar1上
线程2到达您的方法,而foo == bar2
线程2到达同步块并锁定在bar2上


现在,您有2个线程同时运行同步块。我真的找不到您想要的理由。如果这样做,则该块可能不应该同步,并且应该使用其他锁定策略。

另请参见this related post

关于java - Java对象分配和锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12053178/

10-08 21:26