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());
}
}