java cas 性能_java8 如何优化CAS的性能

场景引入

经常都会有下面这段代码,多个线程同时修改一个变量,造成线程不安全,代码如下:

public class ThreadCASDemo implementsRunnable {static int counter=0;static final Object objLock=newObject();

@Overridepublic voidrun() {counter++;

System.out.println("counter"+counter);

}public static voidmain(String[] args) {for (int i = 0; i <20 ; i++) {

ThreadCASDemo threadCASDemo=newThreadCASDemo();

Thread th=newThread(threadCASDemo);

th.start();

}try{

Thread.sleep(2000);

}catch(Exception ex){

}

System.out.println(counter);

}

}

解决方案

加synchronized锁

public class ThreadCASDemo implementsRunnable {static int counter=0;static final Object objLock=newObject();

@Overridepublic voidrun() {synchronized(objLock) {

counter++;

}

System.out.println("counter"+counter);

}public static voidmain(String[] args) {for (int i = 0; i <20 ; i++) {

ThreadCASDemo threadCASDemo=newThreadCASDemo();

Thread th=newThread(threadCASDemo);

th.start();

}try{

Thread.sleep(2000);

}catch(Exception ex){

}

System.out.println(counter);

}

}

加synchronized锁的原理示意图如下:

a267f74833af61b77c2a5defda46b5c9.png

一个个线程排队去更新这个值,这样就感觉太笨重了。synchronized是用来解决更复杂的并发编程场景的。

而且在这个场景下,你一个个排队,加锁处理数据,释放锁,下一个再进来不就相当于串行化了吗。

Atomic原子类

public class ThreadCASAtomic implementsRunnable {static AtomicInteger ati=new AtomicInteger(0);static final Object objLock=newObject();

@Overridepublic voidrun() {

Integer counter=ati.incrementAndGet();

System.out.println("counter"+counter);

}public static voidmain(String[] args) {for (int i = 0; i <20 ; i++) {

ThreadCASDemo threadCASDemo=newThreadCASDemo();

Thread th=newThread(threadCASDemo);

th.start();

}

}

}

这个之所以效率更高,因为底层是无锁化的CAS。(Compare And Set)。

底层原理如下:每个线程都会先获取当前的值,接着走一个CAS操作,原子的意思就是这个CAS操作一定是自己完整执行完的,不会被别人打断的。

然后CAS操作里,会比较一下说:大兄弟,现在你的值不是我刚刚才获取到的那个值啊?

如果是的化,说明没人改过这个值,那你就给我设置累加1的操作,如果不是的话,发现自己获取的值跟当前的值不一样,会导致CAS失败,失败之后,进入一个无线循环,再次获取值,进行CAS操作。

Java 8 中对CAS机制的优化

上面的做法问题就出现在,如果大量的线程同时并发修改一个AtomicInteger,可能会有很多线程,不停的自旋,进入一个无线的重复循环中。

这些线程不停的获取值,不停的失败。

在高并发的时候,这种情况就会很明显,导致性能和效率都不高。

所以java 8 提出了一个LongAdder,他就是尝试使用分段CAS以及自动分段迁移的方式来大幅度提高多线程高并发执行CAS的操作性能。

原文:https://www.cnblogs.com/gdouzz/p/14465666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值