達成するためのいくつかの基本的なコードから始めるために、コードの以下の詳細な説明と、さらに徹底的で強く推奨される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);