扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
java怎样制作线程安全的计数器?相信大部分人都不太了解,今天小编为了让大家更加了解java怎样制作线程安全的计数器,给大家总结了以下内容,一起往下看吧。
成都创新互联公司咨询热线:13518219792,为您提供成都网站建设网页设计及定制高端网站建设服务,成都创新互联公司网页制作领域十余年,包括玻璃钢坐凳等多个方面拥有丰富设计经验,选择成都创新互联公司,为网站保驾护航!
线程安全的计数器实现原理简介:
在java中volatile关键字可以保证共享数据的可见性,它会把更新后的数据从工作内存刷新进共享内存,并使其他线程中工作内存中的数据失效,进而从主存中读入最新值来保证共享数据的可见性,实现线程安全的计数器通过循环CAS操作来实现。就是先获取一个旧期望值值,再比较获取的值与主存中的值是否一致,一致的话就更新,不一致的话接着循环,直到成功为止.
具体代码实现
public class Count{ private int count = 0; private AtomicInteger atomicI = new AtomicInteger(0); public static void main(String[] args){ final Count cas = new Count(); Listlist = new ArrayList (); long start = System.currentTimeMillis(); for(int j=0;j<100;j++){ Thread t = new Thread(new Runnable(){ @Override public void run(){ for(int i=0;i<1000;i++){ cas.count(); cas.safeCount(); } } }); list.add(t); } //启动线程 for(Thread t:list){ t.start(); } //等待所有线程执行完毕 for(Thread t:list){ try{ t.join(); }catch(Exception e){ e.printStackTrace(); } } System.out.println("线程不安全:"+cas.count); System.out.println("线程安全:"+cas.atomicI.get()); System.out.println("耗时:"+(System.currentTimeMillis() - start)); } /**线程不安全的计数器*/ public void count(){ count++; } /**线程安全的计数器,循环CAS*/ public void safeCount(){ for(;;){ int temp = atomicI.get(); if(atomicI.compareAndSet(temp,++temp)) break; } } }
执行结果:
以上就是java如何实现线程安全的计数器的内容,有需要的朋友可以参考一下,望对大家有所帮助,更多请关注创新互联其它相关文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流