1. 程式人生 > >java併發程式設計之利用CAS保證操作的原子性

java併發程式設計之利用CAS保證操作的原子性

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++;
	}
	
	
}