Java对象分配和锁定

use*_*513 2 java synchronization locking

考虑以下代码段:

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


 Object foo = (either bar1 or bar2) ; 
Run Code Online (Sandbox Code Playgroud)

现在,foo在程序的不同时间可以是bar1或bar2.我只想检查synchronized(foo)是否会锁定相应的bar1或bar2.这似乎是最有可能的情况,因为对象不是用Java复制的.它是否正确?

ass*_*ias 6

Object bar1 = new Object();
Object foo = bar1;
synchronized(foo) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

将锁定foo== bar1.

然而,这是一个奇怪且容易出错的构造.例如:

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

现在你有2个线程同时运行你的synchronized块.我真的找不到你想要的原因.如果你这样做,那么该块可能不应该同步,你应该使用不同的锁定策略.

另见这篇相关文章.

  • +1一般来说,除了"final"字段之外,同步任何东西都是个坏主意.如果需要同步`bar1`或`bar2`,则应在内部同步. (4认同)