首页 / JAVA / java8 如何优化CAS的性能
java8 如何优化CAS的性能
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java8 如何优化CAS的性能,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2474字,纯文字阅读大概需要4分钟。
内容图文
![java8 如何优化CAS的性能](/upload/InfoBanner/zyjiaocheng/602/f8eefc37df5a41938e7d072de53e2806.jpg)
场景引入
经常都会有下面这段代码,多个线程同时修改一个变量,造成线程不安全,代码如下:
public class ThreadCASDemo implements Runnable { static int counter=0; static final Object objLock=new Object(); @Override public void run() { counter++; System.out.println("counter"+counter); } public static void main(String[] args) { for (int i = 0; i <20 ; i++) { ThreadCASDemo threadCASDemo=new ThreadCASDemo(); Thread th=new Thread(threadCASDemo); th.start(); } try { Thread.sleep(2000); } catch (Exception ex){ } System.out.println(counter); } }
解决方案
加synchronized锁
public class ThreadCASDemo implements Runnable { static int counter=0; static final Object objLock=new Object(); @Override public void run() { synchronized (objLock) { counter++; } System.out.println("counter"+counter); } public static void main(String[] args) { for (int i = 0; i <20 ; i++) { ThreadCASDemo threadCASDemo=new ThreadCASDemo(); Thread th=new Thread(threadCASDemo); th.start(); } try { Thread.sleep(2000); } catch (Exception ex){ } System.out.println(counter); } }
加synchronized锁的原理示意图如下:
一个个线程排队去更新这个值,这样就感觉太笨重了。synchronized是用来解决更复杂的并发编程场景的。
而且在这个场景下,你一个个排队,加锁处理数据,释放锁,下一个再进来不就相当于串行化了吗。
Atomic原子类
public class ThreadCASAtomic implements Runnable { static AtomicInteger ati=new AtomicInteger(0); static final Object objLock=new Object(); @Override public void run() { Integer counter=ati.incrementAndGet(); System.out.println("counter"+counter); } public static void main(String[] args) { for (int i = 0; i <20 ; i++) { ThreadCASDemo threadCASDemo=new ThreadCASDemo(); Thread th=new Thread(threadCASDemo); th.start(); } } }
这个之所以效率更高,因为底层是无锁化的CAS。(Compare And Set)。
底层原理如下:每个线程都会先获取当前的值,接着走一个CAS操作,原子的意思就是这个CAS操作一定是自己完整执行完的,不会被别人打断的。
然后CAS操作里,会比较一下说:大兄弟,现在你的值不是我刚刚才获取到的那个值啊?
如果是的化,说明没人改过这个值,那你就给我设置累加1的操作,如果不是的话,发现自己获取的值跟当前的值不一样,会导致CAS失败,失败之后,进入一个无线循环,再次获取值,进行CAS操作。
Java 8 中对CAS机制的优化
上面的做法问题就出现在,如果大量的线程同时并发修改一个AtomicInteger,可能会有很多线程,不停的自旋,进入一个无线的重复循环中。
这些线程不停的获取值,不停的失败。
在高并发的时候,这种情况就会很明显,导致性能和效率都不高。
所以java 8 提出了一个LongAdder,他就是尝试使用分段CAS以及自动分段迁移的方式来大幅度提高多线程高并发执行CAS的操作性能。
内容总结
以上是互联网集市为您收集整理的java8 如何优化CAS的性能全部内容,希望文章能够帮你解决java8 如何优化CAS的性能所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。