java - 原子变量与同步方法

标签 java multithreading java.util.concurrent atomic

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

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 一样工作即可;如果有,请尝试为每个线程创建一个单独的工作空间,以便将争用降至最低。

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

关于java - 原子变量与同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50444275/

相关文章:

java - 如果程序整夜运行,为什么我的日子不会改变?

Java多线程

windows - 线程如何在 Windows 上的多个处理器上执行?

java - 创建新对象时扩展类问题

java - 在 eclipse 3.7.2 上更新 swt 插件

java - 为什么Android线程在完成执行之前就被终止了?

java - LockSupport.park(Object blocker)的参数有什么用?

java - Java并发框架的submit方法

java - 使用 Spring 到 @autowire mybatis 映射器的 NullPointerException