【发布时间】:2020-08-24 09:52:22
【问题描述】:
假设我有一个这样的代码块
if (counter < 100) {
synchronized (counter)
if (counter < 100) {
doSomething();
counter.incrementAndGet();
}
}
}
其中计数器是AtomicLong。如何将此块转换为不再使用 synchronized 关键字并且仍然保持其正确性?还是不可能?
【问题讨论】:
-
假设计数器 is 是 AtomicLong,您的代码无法编译。您不能使用
<运算符比较对象和整数。 -
“保持正确性”是什么意思——这段代码在什么方面是正确的?
-
由于同步块内有“doSomething”,因此 AtomicLong 并不足以替代。您可以使用
getAndUpdate之一,但它有点小技巧。
标签: java multithreading java.util.concurrent