例としてCountDownLatchを取り上げて、CASの原則を簡単に説明します

達成するためのいくつかの基本的なコードから始めるために、コードの以下の詳細な説明と、さらに徹底的で強く推奨されるMashi Bing Education-ITセクター+説教授業料FAQを学ぶためのビデオと併せて

AtomicInteger.incrementAndGet();
ここに画像の説明を挿入します
ここに画像の説明を挿入します
unsafeのcompareAndSwapInt(いくつかの引数);
ここに画像の説明を挿入します
jdk8u cmpxchg = compare andexchangeの下のunsafe.cppから学習

アセンブリ言語シリーズis_MP =マルチプロセッサコンピューターがマルチCPUであるかどうかを判別し、そうである場合は、ロックcmpxchg命令(非アトミック命令、同期の基礎となる実装)を追加します
ここに画像の説明を挿入します
ハードウェアレベル:ロック命令は、ロックバス方式を使用する代わりに、後続の命令を実行するときにノースブリッジ信号をロックします(下図のメモリバスに注意してください)。
ここに画像の説明を挿入します


スピンロック(ロックフリー)の概略図:
ここに画像の説明を挿入します
CountDownLatchは、相互に排他的でないスレッド通信用の同期ツールです。スレッドの同期を調整するために使用でき、初期化して使用すると再利用できません。

CountDownLatchの動作原理は、カウンターを組み合わせて、他のスレッドが作業を完了するのを待った後、スレッドに実行の継続を促すことです。カウンターの初期値は、スレッドの総数です。各スレッドがタスクを完了すると、カウンターの値が1つ減ります。カウンターの値が0の場合、すべてのスレッドがスレッドタスクを完了し、CountDownLatchを待機しているスレッドが次の実行を再開できることを意味します。仕事。

転載元:ShaneLi-CountDownLatchの理解と使用

Thread threads[] = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
for (int i = 0; i < threads.length; i++) {
    threads[i] = new Thread(() -> {
        for (int j = 0; j < 100; j++) {
            m.incrementAndGet(); // m++
        }
        latch.countDown();
    });
}

Arrays.stream(threads).forEach((t) -> t.start());
try {
    latch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(m);

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_44965393/article/details/113756905