我想要一个同步块(synchronized block),其中从方法调用返回要同步的对象:
...
synchronized( someGetMethod() ) {
// synchronized block
}
...
是否假设“someGetMethod”是同步的或只有“//同步块(synchronized block)”部分?
提前致谢
编辑: 我有一个集合(要锁定的对象映射)。 “someGetMethod”检查 map 上是否存在对象,如果不存在,它将添加并返回它以便被锁定。 从下面的答案中,我了解到“someGetMethod”可以返回一个已经在Map上的值,但是就在进入同步块(synchronized block)之前,切换到另一个线程,这可能会删除上面的值。因此,另一个线程可能会通过“someGetMethod”进行相同的检查,但现在会得到不同的结果。所以我似乎应该从同步块(synchronized block)中进行删除,是否有更好的选择?
编辑2: 感谢大家的帮助。 我发现了一个类似的问题 - Java synchronized block using method call to get synch object
最佳答案
这个:
synchronized( someGetMethod() ) {
// synchronized block
}
与
相同Object obj = someGetMethod();
synchronized( obj ) {
// synchronized block
}
所以不,someGetMethod()
不是以同步方式调用的。
如果你想让它同步,要么必须声明方法同步,要么显式同步,例如:
synchronized (this) {
synchronized( someGetMethod() ) {
// synchronized block
}
}
关于java - 从方法返回的同步代码中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58256174/