スレッドセーフな-JUC

マルチスレッドの開発では、私たちはしばしば遭遇する問題は、データが繰り返されないことを確実にする方法、セキュリティスレッドを確保する方法を、同時データです。

1.揮発性

揮発性は、一般的に、複数のスレッドで共有変数で使用されるJavaのキーワードであり、

揮発性の原則

各スレッドは、独自のスレッド・ストレージ・スペースを持ち、データ・ストレージ・スペースがメインメモリに同期されたときに不確定です。

揮発性の変数を加えたロックは、同期よりも優れた性能を与えるものではありません、データを読むためにすべての時間を直接揮発性は、その変数を保証することができますスレッドで変数の値を変更する(メモリを読み取るスレッドが書き戻されますメインメモリ、他のスレッドが変数の値を取得するには、メインメモリに移動しますながら)

揮発性の利点と欠点

  • スレッドの同時実行が変数の可視性を保証するために(この変数の変更、他のスレッド、スレッド変数のキャッシュの失敗に見えるが、スレッドが値の最新の変更を取得するために常にあります)
  • 揮発性の変数は秩序を確保するために、スレッドのキャッシュ・バッファと並べ替え内で許可されていません
  • 揮発性のみ各読み取りまたは変更時に原子性を保証し、私は++(原子性を修正/のみ単一の読み取りを保証)原子性を保証するものではありません。

2. CAS(コンペア・アンド・スワップ)

CASはJDK1.5が導入された後、交換価値を比較するために、名前で知ることができ、古い値メモリの比較によって、同じ単語が新しい値に変更されます

比較とスワップ原理

CAS命令は、メモリアドレスと時刻が変更、または直接、最新の値が何もしません返したい値にメモリの変更に同じ値の値を変更する場合にのみ実行されますが、時折ない限り、再試行しますとき(スピン)まで更新。このため、CASにはロックが存在しない場合でも、他のスレッドは、現在の変数への変更を検出することができます。

JNI(Javaのローカルコール)、危険な運転アトミックの使用によって達成CAS(アトミック危険なハードウェアレベルのオペレーティングシステムのいずれか一緒に成功するか、一緒に失敗)

長所と短所を比較とスワップ

利点:

  • スレッド(従属変数露光揮発性)との間のデータ共有の助けなしに達成ゲンロック
  • 状況は非常に深刻ではないし、次に重い繰り返されるメモリ矛盾の値を比較することと、CASは楽観楽観的ロック、並行性を属し、アイデアからで、悲観的ロックが属する同期、悲観的同時実行は、深刻な考えられしっかりとリソースをしがみつきましたテスト

短所

  • CPUのオーバーヘッドは、CASのスピン機構から、値を更新するために、スレッドを繰り返し試みにつながるので、CPUは多くの圧力をもたらし、比較的大きいです
  • 変数の唯一の保証アトミックはアトミックコードブロックを保証するものではありません
  • ABAの問題
ABA举证:
场景:假设ATM机底层用CAS实现的存取钱操作
小明账户还有100元,在ATM机上准备取出50元,假如ATM机bug或者鼓掌,小明触发了2次取钱操作;
这个时候如果只是触发了2次也没关系,在第一个请求处理时,根据CAS原理,对比账户余额和实际账户余额是一致的都是100,此时账户剩余50,并发的第二次取钱操作根据原理肯定是不会执行,但是会阻塞等待重试;这个时候是对账户没有任何影响的。
再假设如果在小明取钱的同时,小明家里给小明打了50元钱;这个时候还会是这样的情况?
在打钱线程执行的时候,发现账户余额期望值50与账户一致,打钱成功,账户余额:100;这还没完,
第2次取钱操作此时重试,发现期望值100与余额一致,余额扣款成功;

小明的账户经历了: 100(A) --> 50(B) --> 100(A) --> 50

アバター

ABA解决方法:在比较期望值和内存值的时候在增加比对内存地址值的版本号是否一致,线程每次在变更内存地址值的时候都会刷新版本。可以通过AtomicStampedReference类来实现版本的比较

public boolean compareAndSet(V   expectedReference,
                                 V   newReference,
                                 int expectedStamp,
                                 int newStamp) {
        Pair<V> current = pair;
        return
            expectedReference == current.reference &&
            expectedStamp == current.stamp &&
            ((newReference == current.reference &&
              newStamp == current.stamp) ||
             casPair(current, Pair.of(newReference, newStamp)));
    }

CASアプリケーション

java.util.concurrentのとで契約

  • AQS(AbstractQueuedSynchronizer)、およびFIFO同期を達成するために行われ、基礎となる状態変数アトミック動作に依存しているキューを、待機フレームロックをブロックする一連の、使用される変性状態CASなどがあります...
protected final boolean compareAndSetState(int expect, int update) {
        // See below for intrinsics setup to support this
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
  • AtomicInteger、AtomicBooleanはあなたが値を更新することができますのcompareAndSet

アプリケーション開発で

  • 要求は、ATO基づいて、同時操作することによって達成することができます
  • 変数へのcasアトミック操作により、

おすすめ

転載: www.cnblogs.com/hetangyuese/p/11655398.html