版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwl2014100338/article/details/81876709
基于CAS线程安全的计数器方法和非线程安全的计数器
package com.lwl.concurrency.page2;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author liuweilong
* @ClassName: Counter
* @Description: 使用循环CAS实现原子操作
* @Date 2018-08-20 19:14
* @Version 1.0
**/
public class Counter {
private AtomicInteger atomicI= new AtomicInteger(0);
private int i=0;
public static void main(String[] args) {
final Counter cas=new Counter();
List<Thread> ts=new ArrayList<Thread>(600);
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<10000;i++){
cas.count();
cas.safeCount();
}
}
});
ts.add(t);
}
for (Thread t:ts){
t.start();
}
//等待所有线程执行完毕
for (Thread t:ts) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cas.i);
System.out.println(cas.atomicI.get());
System.out.println(System.currentTimeMillis()-start);
}
}
/* * CAS实现线程安全计数器 */
private void safeCount(){
for (;;){
int i=atomicI.get();
boolean suc= atomicI.compareAndSet(i,++i);
if (suc){
break;
}
}
}
/**
* 非线程安全计数器
*/
private void count(){
i++;
}
}