使用 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次,即使它们失败了也算一次迭代。
简而言之,为了让我们说如果保持正确性,那么您需要非常具体地定义正确性意味着什么。
如果您不知道它是正确的意味着什么,那么您最好保持原样。
假设我有这样的代码块
if (counter < 100) {
synchronized (counter)
if (counter < 100) {
doSomething();
counter.incrementAndGet();
}
}
}
其中计数器是 AtomicLong
。我如何将此块转换为不再使用 synchronized
关键字并仍然保持其正确性?还是不可能?
这完全取决于您未显示的 doSomething
。它可能依赖于从同步块中调用,甚至可能无法并行化。
我认为可能可以接受的一个替换是
if (counter.getAndIncrement() < 100) {
doSomething();
}
但是假设doSomething
总是抛出异常。在您的代码中,计数器永远不会递增,因此条件将始终解析为真。在上面的例子中,它会被调用前100次,即使它们失败了也算一次迭代。
简而言之,为了让我们说如果保持正确性,那么您需要非常具体地定义正确性意味着什么。
如果您不知道它是正确的意味着什么,那么您最好保持原样。