java 如何实现计数_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 list = 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;

}

}

}

执行结果:

a7c89b311da7883b454407c709609fc5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值