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

我想要一个同步块,其中要同步的对象是从方法调用返回的:


...

synchronized( someGetMethod() ) {

// synchronized block

}

...

是否假设“someGetMethod”是同步的或仅“//同步块”部分?


先感谢您


编辑:我有一个集合(要锁定的对象的映射)。“someGetMethod”检查地图上是否存在对象,如果不存在,它将添加该对象并返回它以便锁定。从下面的答案中,我了解到“someGetMethod”可以返回Map上已有的值,但在进入同步块之前,切换到另一个线程,这可能会删除上述值。因此,另一个线程可能通过“someGetMethod”进行相同的检查,现在得到不同的结果。所以看来我应该从同步块中进行删除,是否有更好的选择?


慕码人8056858
浏览 79回答 2
2回答

POPMUISE

这:synchronized( someGetMethod() ) {// synchronized block}是相同的Object obj = someGetMethod();synchronized( obj ) {// synchronized block}所以不,someGetMethod()不是以同步方式调用。如果你想让它同步,你要么必须声明方法synchronized,要么显式同步,例如:synchronized (this) {  synchronized( someGetMethod() ) {    // synchronized block  }}

守着星空守着你

someGetMethod()是在线程锁定与表达式结果关联的监视器之前计算的表达式。14.19。同步语句同步语句是通过首先评估表达式来执行的。然后:如果表达式的求值由于某种原因突然完成,那么同步语句也会因为同样的原因突然完成。否则,如果 Expression 的值为 null,则抛出 NullPointerException。否则,设Expression的非空值为V。执行线程锁定与V关联的监视器。然后执行该Block,然后有一个选择:如果块的执行正常完成,则监视器被解锁并且同步语句正常完成。如果该块的执行由于任何原因突然完成,则监视器将被解锁并且同步语句由于相同原因突然完成。您无法输入同步块,计算表达式,然后查看与结果关联的监视器。你是如何进入这个块而不首先评估它的表达式的?你用什么显示器someGetMethod()来同步自己?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java