AtomicBooleanを使用してリソースを優雅に初期化


多くのシーンでは、リソースのロードなどの初期化操作が必要で、一度だけ初期化するだけで問題があります.
  • 初回操作としてどのように判断するか
  • .
  • 同時処理の場合、どのようにして一度だけ初期化することを保証して、
  • を繰り返しません
     
    一、AtomicBoolean神器
    java.util.concurrent.atomic.AtomicBoolean、このブール操作類は一連の操作がすべて原子操作であることを保証し、マルチスレッド環境下の同時不安全問題を受けない、原理は不思議なsunに依存する.misc.Unsafeサポート.
     
     
    二、推奨使用手順
     
    public class InitXxxService{
        
        private AtomicBoolean initState = new AtomicBoolean(false);
    
        @Override
        public void init() {
            if (! initState.compareAndSet(false, true)) {//init once
                return ;
            }
            
            //TODO  
        }
    }

     
    三、原理紹介
     
    public final boolean compareAndSet(boolean expect, boolean update) ;
     
     
    この方法は、現在のAtomicBooleanオブジェクトの値がexpectと等しい場合、updateの値を更新し、trueを返します.そうでない場合falseを返します.
     
    ここでは2つのことをしました
  • 現在の値はexpectと比較されます.等しい場合は第2のステップを継続し、等しくない場合はfalse
  • に直接戻る.
  • 現在の値をupdateに更新し、true
  • に戻る.
     
     
    この2つのステップは原子操作であり,初期化におけるマルチスレッド環境における同時セキュリティの問題を解決する.