Java マルチスレッドを理解している読者なら、その役割を明確に理解できると思います。 volatile キーワードは、int、float、boolean、その他のデータ型などの単純型変数を宣言するために使用されます。これらの単純なデータ型が volatile として宣言されている場合、それらに対する操作はアトミックになります。しかし、これには一定の制限があります。たとえば、次の例の n はアトミックではありません。
次のようにコードをコピーします。
パッケージの mythread;
パブリッククラス JoinThread は Thread を拡張します
{
public static volatile int n = 0;
public void run()
{
for (int i = 0; i < 10; i++)
試す
{
n = n + 1;
sleep(3); // 実行結果をよりランダムにするために、3 ミリ秒遅延します。
}
catch (例外 e)
{
}
}
public static void main(String[] args) が例外をスローする
{
スレッド thread[] = 新しいスレッド [100];
for (int i = 0; i < thread.length; i++)
// 100 個のスレッドを作成します
スレッド[i] = 新しい JoinThread();
for (int i = 0; i < thread.length; i++)
//作成したばかりの 100 個のスレッドを実行します
スレッド[i].start();
for (int i = 0; i < thread.length; i++)
// 100 個のスレッドがすべて実行された後に続行
スレッド[i].join();
System.out.println("n=" + JoinThread.n);
}
}
n に対する操作がアトミックである場合、最終的な出力結果は n=1000 になるはずですが、上記のエリア コードを実行すると、出力 n は 1000 未満になることがよくあります。これは、n=n+1 がアトミック レベルの操作ではないことを示しています。 。その理由は、volatile として宣言された単純な変数の場合、現在の値が変数の前の値に関連している場合、 volatile キーワードは効果がないためです。つまり、次の式はアトミック操作ではありません。
次のようにコードをコピーします。
n = n + 1;
n++;
この状況をアトミック操作にしたい場合は、synchronized キーワードを使用する必要があります。上記のコードは次の形式に変更できます。
次のようにコードをコピーします。
パッケージの mythread;
パブリッククラス JoinThread は Thread を拡張します
{
パブリック静的 int n = 0;
public static synchronized void inc()
{
n++;
}
public void run()
{
for (int i = 0; i < 10; i++)
試す
{
inc(); // n = n + 1 が inc() に変更されます。
sleep(3); // 実行結果をよりランダムにするために、3 ミリ秒遅延します。
}
catch (例外 e)
{
}
}
public static void main(String[] args) が例外をスローする
{
スレッド thread[] = 新しいスレッド [100];
for (int i = 0; i < thread.length; i++)
// 100 個のスレッドを作成します
スレッド[i] = 新しい JoinThread();
for (int i = 0; i < thread.length; i++)
//作成したばかりの 100 個のスレッドを実行します
スレッド[i].start();
for (int i = 0; i < thread.length; i++)
// 100 個のスレッドがすべて実行された後に続行
スレッド[i].join();
System.out.println("n=" + JoinThread.n);
}
}
上記のコードは、n=n+1 を inc() に変更します。ここで、inc メソッドはメソッドの同期に synchronized キーワードを使用します。したがって、volatile キーワードを使用する場合は、変数の値が前の値によって決定される場合、この変数に対するすべての操作が元の操作になるわけではありません。 n+1 、 n++ など、変数に対する操作は、変数の値が前の値と関係がない場合にのみ無効になります。たとえば、 n = m + 1 です。本来のレベルです。したがって、揮発性キーを使用するときは注意が必要です。よくわからない場合は、揮発性キーの代わりに同期キーを使用できます。