import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger atomicI = new AtomicInteger(0);//实现原子操作的Integer类型
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() {
// TODO Auto-generated method stub
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(;;){//循环CAS
int i = atomicI.get();//当前值
//CAS: 比较当前值和期望值是否相等,如果相等将当前值替换成新值,返回true,不相等返回false
boolean suc = atomicI.compareAndSet(i, ++i);//第一个i 是期望值 第二个是 新值
if(suc){
break;
}
}
}
private void count(){
i++;
}
}
java并发编程之利用CAS保证操作的原子性
最新推荐文章于 2023-03-17 09:53:34 发布