java - 跳出同步块(synchronized block)?

标签 java synchronized

我有这个:

synchronized(c){
   if (!items.hasNext() && (c.getFinishedCount() == c.getStartedCount())) {
      f.done(null, results);
      return;
    }

    if(c.isBelowCapacity()){
      RunMap(items,m,results,c,s,f);
    }
}

但最终当我调用 RunMap()f.done() 时我不需要在 c 上同步,我只需要在 c 上同步当我执行条件检查/if 语句时。

我是否应该让 c 上的方法同步,然后摆脱同步块(synchronized block)?

最佳答案

Should I just make the methods on c synchronized, and then get rid of the synchronized block?

不,更好的方法是在同步块(synchronized block)中进行检查,然后再做剩下的工作:

boolean bFDone = false;
boolean bRunMap = false;

synchronized (c) {
    bFDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
    bRunMap = !bFDone && c.isBelowCapacity();
}

if (bFDone) {
    f.done(null, results);
} else if (bRunMap) {
    RunMap(items,m,results,c,s,f);
}

这个版本的一大优势是,所有可变代码实际上是同步的,其余(可能很慢)的东西稍后发生。

正如对此答案的评论中正确提到的那样,如果您的初始假设是正确的,即整个 block 不需要同步,这只会正常工作。如果您需要立即对条件使用react,那么该 block 实际上需要(完全)同步。

关于java - 跳出同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54625619/

相关文章:

java - 输入不带扩展名的文件名(java)

java - 如何将捕获的图像路径从imageview保存到mysql数据库

java - 线程中的 IllegalMonitorStateException

java - Java synchronized 关键字是否刷新缓存?

java - 使用 Java ZipFile 类解压缩 ZIP 文件

java - 如何解决 120000 MILLISECONDS 异常错误后 mongodb client Timeout waiting for a pooled item

java - 如何成功运行 Google Drive API 的 "Java Quickstart"示例?

java - 如何在java中对同步方法进行单元测试?

java - java中默认可以并发执行实例方法吗?

Java:在 String 对象上同步