首页  >  文章  >  Java  >  java如何实现线程安全的计数器?实现线程安全的计数器的方法

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

青灯夜游
青灯夜游转载
2018-10-22 17:42:425436浏览

本篇文章给大家带来的内容是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;
		}
	}
}

执行结果:

1.png

以上是java如何实现线程安全的计数器?实现线程安全的计数器的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:csdn.net。如有侵权,请联系admin@php.cn删除