多线程 +1 的最快操作

作者:微信小助手

发布时间:2021-07-05T09:25:55

直奔主题,多个线程,一个共享变量,不断 +1。

如果代码直接这样写,会产生线程安全问题。

public class LongAdder {
   private long count = 0L;
   public void add() {
       count++;
   }
}

可以加锁去实现,但效率太低。

public class LongAdder {
   private long count = 0L;
   public void add() {
   synchronized(this){
       count++;
   }
}

可以用原子类这种乐观锁实现,比加 synchronized 锁效率高很多。

public class LongAdder {
   private AtomicLong count = new AtomicLong(0L);
   public void add() {
       count.incrementAndGet();
   }
}

当然,更高级的玩法也可以自己调用 UNSAFE 模拟原子类里的 CAS 操作,但实际上就是把原子类的源码给展开了。(v = count 应该放在循环里)

public class LongAdder {
   
private volatile long count = 0L;
   
public void add() {
       
boolean success = false;
       
int v = count;
       
while(!success) {
           success = UNSAFE.compareAndSwapLong(
                    LongAdder
.classcountOffsetvv + 1);
       }
   }
}

这几段多线程 +1 的代码如果看不明白,可以找些资料把这块的基础补一下哈,本文就不赘述了,我们继续。

关于这个多线程 +1 操作,有没有效率更高的办法呢?