AtomicInteger-java同時プログラミング(一)
2418 ワード
1:AtomicIntegerはUnsafeによって同時状況におけるintergerの一般的な操作を実現する2:AtomicIntegerは楽観的なロックCASを採用する下でAtomicInteger+unSafeのCASのソースコード分析を通じてjava同時状況におけるプログラミングをさらに理解する.主な方法unsafeのcompareAndSwapInt,objectFieldOffset;AtominIntegerにおけるvolatile修飾valueとincrementAndGetの実現原理; unsafe.compareAndSwapInt(this,valueOffset,expect,update)はnativeメソッドです.これはobjectクラス、valueOffsetを示します.このパラメータはメモリオフセット量であることを示します.expect、メモリ内の元の値、updateは新しい値 objectFieldOffsetにより、参照アドレスがvalueであるobjectのメモリオフセット量が検出され、メモリオフセット量により参照アドレスに対応するコンテンツ が取得される.メンバー変数int valueは、volatileによって修飾されていることに注意してください.すなわち、値を取るたびにメモリの最新値となり、更新時にもメモリの に最新値が更新されます. AtomicIntegerのincrementAndGetメソッドにforループがあることに注意してください.このサイクルでget()メソッドにより最新のメモリ値が取得され、他のスレッドが現在の値を更新している場合、その値は更新されません.他のスレッド操作がない場合、更新は成功しました.
3:適用
参考文献:UnSafeのclassソース:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html JAva合併大神doug-leahttp://ifeve.com/doug-lea/優秀なブログhttps://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
public final int incrementAndGet() {
for (;;) {
// , volatile , ( )
int current = get();
// ;
int next = current + 1;
//** : current , , ,
if (compareAndSet(current, next))
return next;
}
}
3:適用
public static void main(String[] args) {
// AtomicInteger,
AtomicInteger atomicInteger = new AtomicInteger(1);
long tt = System.currentTimeMillis();
//
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int k = 0; k < 10; k++) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
atomicInteger.incrementAndGet();
} catch (java.lang.Exception e) {
System.out.println(e);
}
}
});
}
executorService.shutdown();
System.out.println("atmoic : " + atomicInteger);
System.out.println("time cost: "+ (System.currentTimeMillis()-tt));
}
参考文献:UnSafeのclassソース:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html JAva合併大神doug-leahttp://ifeve.com/doug-lea/優秀なブログhttps://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/