2 回答
TA贡献1765条经验 获得超5个赞
这:
synchronized( someGetMethod() ) {
// synchronized block
}
是相同的
Object obj = someGetMethod();
synchronized( obj ) {
// synchronized block
}
所以不,someGetMethod()不是以同步方式调用。
如果你想让它同步,你要么必须声明方法synchronized,要么显式同步,例如:
synchronized (this) {
synchronized( someGetMethod() ) {
// synchronized block
}
}
TA贡献1799条经验 获得超8个赞
someGetMethod()
是在线程锁定与表达式结果关联的监视器之前计算的表达式。
14.19。同步语句
同步语句是通过首先评估表达式来执行的。然后:
如果表达式的求值由于某种原因突然完成,那么同步语句也会因为同样的原因突然完成。
否则,如果 Expression 的值为 null,则抛出 NullPointerException。
否则,设Expression的非空值为V。执行线程锁定与V关联的监视器。然后执行该Block,然后有一个选择:
如果块的执行正常完成,则监视器被解锁并且同步语句正常完成。
如果该块的执行由于任何原因突然完成,则监视器将被解锁并且同步语句由于相同原因突然完成。
您无法输入同步块,计算表达式,然后查看与结果关联的监视器。你是如何进入这个块而不首先评估它的表达式的?你用什么显示器someGetMethod()
来同步自己?
添加回答
举报