java - 从方法返回的同步代码中的对象

标签 java synchronized synchronized-block

我想要一个同步块(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/

相关文章:

java - 为什么 `synchronized (lock)`被不同的线程输入两次?

java - 在同步代码块中调用java计时器

java - 使用 JSF 从用户获取日期输入并存储在数据库中时出错

java - (JAVA)将十进制转换为二进制编码的十进制?

java - 为什么通知不显示在 API 28 中?

java - 对象级锁定是线程安全的吗?

Java线程一致性问题

java - monitor对象在synchronized block 中有什么作用?

java - 如何在 Android 上 MediaStore.Images.Media 选择图像后调整图像大小

java - Android - 从同步块(synchronized block)启动线程