java如何实现线程安全的计数器?实现线程安全的计数器的方法

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是java如何实现线程安全的计数器?实现线程安全的计数器的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

  • 线程安全的计数器实现原理简介:
    在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();   List<Thread> list = new ArrayList<Thread>();   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如何实现线程安全的计数器?实现线程安全的计数器的方法

本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » java如何实现线程安全的计数器?实现线程安全的计数器的方法

发表评论

提供最优质的资源集合

立即查看 了解详情