作者:微信小助手
发布时间:2021-07-05T09:25:55
如果代码直接这样写,会产生线程安全问题。
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.class, countOffset, v, v + 1);
}
}
}
这几段多线程 +1 的代码如果看不明白,可以找些资料把这块的基础补一下哈,本文就不赘述了,我们继续。
关于这个多线程 +1 操作,有没有效率更高的办法呢?