考虑以下代码片段:
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/