首页 > 解决方案 > 原子变量与同步方法

问题描述

我有一个具有递增和递减方法的计数器类,这两种方法都是同步的。

public class Counter {
   int count = 0;
   public synchronized void increment(){
       count++;
   }

   public synchronized void decrement(){
       count--;
   }
}

从这个例子中可以清楚地看出,竞争条件不会发生,只有一个线程可以访问增量或减量方法。

现在代替整数基元,如果我用原子整数修改计数器类并删除同步关键字,我们可以实现同样的事情吗?

public class Counter {
    AtomicInteger count = new AtomicInteger();

    public void increment(){
       count.incrementAndGet();
    }

    public void decrement(){
       count.decrementAndGet();
    }
}

标签: javamultithreadingjava.util.concurrentatomic

解决方案


java-8有一个更好的(在真正竞争的环境中读取速度更快)选项而不是 开始AtomicInteger,它被调用LongAdder并以相同的方式保证原子更新:

在低更新争用下,这两个类具有相似的特征(AtomicLong)。但是在高竞争下,这个类的预期吞吐量明显更高,代价是更高的空间消耗。

它的实现非常棒。用简单的英语(简体):如果线程之间没有争用,不要做一个聪明的驴子,只需像使用 AtomicLong 一样工作;如果有,请尝试为每个线程创建一个单独的工作空间,以便最大限度地减少争用。

它具有您关心的相同方法:adddecrement.


推荐阅读