我有一个计数器类,它有递增和递减方法,这两个方法是同步的。
public class Counter {
int count = 0;
public synchronized void increment(){
count++;
}
public synchronized void decrement(){
count--;
}
}
从这个例子中可以很清楚地看出竞争条件不会发生,只有一个线程可以访问递增或递减方法。
现在,如果我用 Atomic Integer 修改计数器类并删除 synchronized 关键字,而不是整数基元,我们可以实现同样的事情吗?
public class Counter {
AtomicInteger count = new AtomicInteger();
public void increment(){
count.incrementAndGet();
}
public void decrement(){
count.decrementAndGet();
}
}
最佳答案
从 java-8
开始,有一个更好(在真正竞争环境中读取速度更快)选项而不是 AtomicInteger
,它称为 LongAdder
并且它以相同的方式保证原子更新:
Under low update contention, the two classes have similar characteristics (AtomicLong). But under high contention, expected throughput of this class is significantly higher, at the expense of higher space consumption.
它的实现非常棒。用简单的英语(简体):如果线程之间没有争用,就不要做一个聪明的 SCSS ,只需像使用 AtomicLong 一样工作即可;如果有,请尝试为每个线程创建一个单独的工作空间,以便将争用降至最低。
它具有您关心的相同方法:add
和 decrement
。
关于java - 原子变量与同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50444275/