java - 同步块(synchronized block)和 while 循环优化排序

标签 java concurrency synchronization synchronized

如果我正在等待这样的条件(注意:current 是一个 AtomicIntegertarget 是一个 int):

while (current.get() < target) {
    try {
        synchronized (current) {
            current.wait();
        }
    }
    catch (InterruptedException ie) {}
}

那么 synchronized 应该进入 while 内部(如上所述)还是外部,就像这样?

synchronized (current) {
    while (current.get() < target) {
        try {
            current.wait();
        }
        catch (InterruptedException ie) {}
    }
}

我的问题是,上面两段代码之间的实际/功能区别是什么?什么时候应该使用其中一段代码?

编辑:当另一个线程执行以下操作时退出循环

if (current.incrementAndGet() >= target) {
    synchronized (current) {
        current.notify();
    }
}

最佳答案

这取决于critical section是什么代码,而不是最佳实践。


但是,最好将临界区代码长度保持在最低限度,因为您一次只允许一个线程进入它。否则,更极端的是,您可以同步整个程序并使其安全。

关于java - 同步块(synchronized block)和 while 循环优化排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54669932/

相关文章:

java - 如何在 Java 中将字符串转换为 Time 对象?

java - 如何使 ScheduledExecutorService 在其计划任务被取消时自动终止

Java线程并发读写

java - Swing:区分用户引起的组件大小调整和自动组件大小调整的问题(编写自定义布局管理器)

ios - 实时同步

Java:需要同步 ExecutorService 吗?

java - Android MainDexClassList 构建错误

java - 如何在JGit中编写git log --stat命令

java - 递归和/或 getBackground() 未按预期工作

java - 创建n个变量java