代码之家  ›  专栏  ›  技术社区  ›  Sina Madani

同步块和while循环优化排序

  •  2
  • Sina Madani  · 技术社区  · 6 年前

    如果我是在这样的条件下等待(注: current 是一个 AtomicInteger target 是一个 int ):

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

    那么同步的进程应该在while内部(如上所述)还是在while外部,像这样?

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

    我的问题是,上面两段代码在实际/功能上有什么区别,什么时候应该使用一段代码而不是另一段代码?

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

    if (current.incrementAndGet() >= target) {
        synchronized (current) {
            current.notify();
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   displayName    6 年前

    这是由什么决定的 critical section 而不是最佳实践。


    但是,最好将关键部分代码长度保持在最小值,因为一次只允许一个线程进入它。否则,为了达到极限,可以同步整个程序并使其安全。