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如何实现线程安全的计数器的内容,有需要的朋友可以参考一下,望对大家有所帮助,更多请关注亿速云其它相关文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。