使用 Java 个原子变量执行方法调用

Executing a method call with Java atomic variables

假设我有这样的代码块

if (counter < 100) {
    synchronized (counter)
        if (counter < 100) {
            doSomething();
            counter.incrementAndGet();
        }
    }
}

其中计数器是 AtomicLong。我如何将此块转换为不再使用 synchronized 关键字并仍然保持其正确性?还是不可能?

这完全取决于您未显示的 doSomething。它可能依赖于从同步块中调用,甚至可能无法并行化。

我认为可能可以接受的一个替换是

if (counter.getAndIncrement() < 100) {
    doSomething();
}

但是假设doSomething总是抛出异常。在您的代码中,计数器永远不会递增,因此条件将始终解析为真。在上面的例子中,它会被调用前100次,即使它们失败了也算一次迭代。

简而言之,为了让我们说如果保持正确性,那么您需要非常具体地定义正确性意味着什么。

如果您不知道它是正确的意味着什么,那么您最好保持原样。