Javaで並行性を読んでいる間、私は以下の疑問を抱えています:
Javaは低レベルの構成を提供し、同期のために同期されますか?
同期化されたセマフォを使用する状況(Javaでのモニター動作を提供する)
Synchronizedはone実行のスレッドのみが同時にリソースにアクセスすることを許可します。セマフォでは、最大n(nを選択できます)の実行スレッドで同時にリソースにアクセスできます。
http://docs.Oracle.com/javase/tutorial/essential/concurrency/atomic.html によると、volatile
キーワードもありますvolatile
変数へのアクセスは、同期コードを介してこれらの変数にアクセスするよりも効率的です
Java.util.concurrent.Semaphore
は、リソースにアクセスできるスレッドの数を制限するために使用されます。つまり、synchronized
は1つのスレッドのみがロックを取得して同期化されたブロック/メソッドを実行できるようにしますが、セマフォは最大n個のスレッドに許可を与え、他のスレッドをブロックします。
atomics もあります。これにより、すべての同期の基礎となる基本的なハードウェアのcompare-and-swapコマンドにアクセスできます。たとえば、安全に数値をインクリメントできます。もし、あんたが ++
揮発性フィールド。同じ命令を実行する別のスレッドが、スレッドがフィールドに書き込む前にフィールドを読み取り、その後、スレッドにafter書き戻します。したがって、1つの増分が失われます。アトミックは「アトミック」に読み書きを行うため、問題を回避できます。
実際には、揮発性、同期化されたステートメント、およびアトミックは、すべてのスレッドデータを強制的にメインメモリから更新するか、メインメモリに適切に書き込む傾向があります。それらのどれも本当にその低レベルではありません。 (ここでは簡略化しています。C#とは異なり、Javaには「メインメモリ」の概念はありません。)