java併發程式設計之利用CAS保證操作的原子性
阿新 • • 發佈:2018-10-31
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++; } }