最近、volatile キーワードのこの奇妙な動作を経験しました。私の知る限りでは、
volatile キーワードが変数に適用され、あるスレッドによって変数のデータに対して行われた変更が他のスレッドに反映されます。
volatile キーワードは、スレッドでのデータのキャッシュを防ぎます。
私は小さなテストをしました........
count という整数変数を使用し、それに対して volatile キーワードを使用しました。
次に、変数値を 10000 にインクリメントする 2 つの異なるスレッドを作成したため、最終的な結果は 20000 になるはずです。
しかし、常にそうであるとは限りません.volatileキーワードを使用すると、一貫して20000を取得できませんが、18534、15000など....そして時には20000になります.
しかし、同期キーワードを使用している間、それはうまくいきました.なぜ....??
volatile キーワードのこの動作を説明してください。
volatile キーワードと synchronzied キーワードを含むコードを投稿しています。
以下のコードは、変数カウントの volatile キーワードで一貫性のない動作をします。
public class SynVsVol implements Runnable{
volatile int count = 0;
public void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}
次のコードは、メソッド go() の synchronized キーワードで完全に動作します。
public class SynVsVol implements Runnable{
int count = 0;
public synchronized void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}