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のメモリオフセット量が検出され、メモリオフセット量により参照アドレスに対応するコンテンツ
  • が取得される.
    static {
            try {
                valueOffset = unsafe.objectFieldOffset
                    (AtomicInteger.class.getDeclaredField("value"));
            } catch (Exception ex) { throw new Error(ex); }
        }
    
  • メンバー変数int valueは、volatileによって修飾されていることに注意してください.すなわち、値を取るたびにメモリの最新値となり、更新時にもメモリの
  • に最新値が更新されます.
  • AtomicIntegerのincrementAndGetメソッドにforループがあることに注意してください.このサイクルでget()メソッドにより最新のメモリ値が取得され、他のスレッドが現在の値を更新している場合、その値は更新されません.他のスレッド操作がない場合、更新は成功しました.
    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/