为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2023-09-27 17:02:28
我想要一个同步块,其中要同步的对象是从方法调用返回的:...synchronized( someGetMethod() ) {// synchronized block}...是否假设“someGetMethod”是同步的或仅“//同步块”部分?先感谢您编辑:我有一个集合(要锁定的对象的映射)。“someGetMethod”检查地图上是否存在对象,如果不存在,它将添加该对象并返回它以便锁定。从下面的答案中,我了解到“someGetMethod”可以返回Map上已有的值,但在进入同步块之前,切换到另一个线程,这可能会删除上述值。因此,另一个线程可能通过“someGetMethod”进行相同的检查,现在得到不同的结果。所以看来我应该从同步块中进行删除,是否有更好的选择?
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

这:


synchronized( someGetMethod() ) {

// synchronized block

}

是相同的


Object obj = someGetMethod();

synchronized( obj ) {

// synchronized block

}

所以不,someGetMethod()不是以同步方式调用。


如果你想让它同步,你要么必须声明方法synchronized,要么显式同步,例如:


synchronized (this) {

  synchronized( someGetMethod() ) {

    // synchronized block

  }

}


查看完整回答
反对 回复 2023-09-27
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

someGetMethod()是在线程锁定与表达式结果关联的监视器之前计算的表达式。

14.19。同步语句

同步语句是通过首先评估表达式来执行的。然后:

  • 如果表达式的求值由于某种原因突然完成,那么同步语句也会因为同样的原因突然完成。

  • 否则,如果 Expression 的值为 null,则抛出 NullPointerException。

  • 否则,设Expression的非空值为V。执行线程锁定与V关联的监视器。然后执行该Block,然后有一个选择:

    • 如果块的执行正常完成,则监视器被解锁并且同步语句正常完成。

    • 如果该块的执行由于任何原因突然完成,则监视器将被解锁并且同步语句由于相同原因突然完成。

您无法输入同步块,计算表达式,然后查看与结果关联的监视器。你是如何进入这个块而不首先评估它的表达式的?你用什么显示器someGetMethod()来同步自己?


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信