java 多線程 原子類

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * Java SE5引入了諸如AtomicInteger,AtomicLong,AtomicReference 等特殊的原子性變量類,
 * 它們提供下面形式的原子性條件更新操作:
 * boolean compareAndSet(expectedValue,updateValue);
 * 這些類被調整爲使用在某些現代處理器上的可獲得的,並且是在機器級別上的原子性,因此在使用它們時,
 * 通常不需要擔心。對於常規編程來說,它們很少會派上用場,但是在涉及性能調優時,它們就大有用武之地了。
 * 
 * 
 * @create @author Henry @date 2016-11-30
 *
 */
public class AtomicIntegerTest implements Runnable{
	private AtomicInteger i=new AtomicInteger(0);
	public int getValue(){return i.get();}
	private void evenIncrement(){i.addAndGet(2);}
	@Override
	public void run() {
		while(true)
			evenIncrement();
	}
	/**
	 * 這裏通過使用AtomicInteger而消除了synchronized關鍵字。因爲這個程序不會失敗,
	 * 所以加了一個Timer,以便在5秒鐘之後自動地終止。
	 * 
	 * @create @author Henry @date 2016-11-30
	 * @param args
	 */
	public static void main(String[] args) {
		/*new Timer().schedule(new TimerTask() {
			@Override
			public void run() {
				System.err.println("Aborting");
				System.exit(0);
			}
		}, 5000);*/
		ExecutorService exec=Executors.newCachedThreadPool();
		AtomicIntegerTest ait=new AtomicIntegerTest();
		exec.execute(ait);
		while(true){
			int val=ait.getValue();
			if(val%2!=0){
				System.out.println(val);
				System.exit(0);
			}
		}
	}
}


import java.util.concurrent.atomic.AtomicInteger;
/**
 * 用AtomicInteger重寫的MutexEvenGenerator
 * Atomic類被設計用來構建java.util.concurrent中的類,因此只有在特殊情況下才
 * 在自己的代碼中使用它們,即便使用了也不需要保證不存在其他可能出現的問題。
 * 通常依賴於鎖要更安全一些(要麼是synchronized關鍵字,要是是顯示的Lock對象)
 * 
 * @create @author Henry @date 2016-11-30
 *
 */
public class AtomicEvenGenerator extends IntGenerator {
	private AtomicInteger currentEvenValue=new AtomicInteger(0);
	
	@Override
	public int next() {
		return currentEvenValue.addAndGet(2);
	}
	/**
	 * 所以其他形式的同步再次通過使用AtomicInteger得到了根除。
	 * @create @author Henry @date 2016-11-30
	 * @param args
	 */
	public static void main(String[] args) {
		EvenChecker.test(new AtomicEvenGenerator());
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章