0

私は揮発性変数を初めて使用しますが、2) 揮発性変数は、可視性など、Java で同期を実現する別の方法として使用できるという記事を読んでいました。volatile 変数を使用すると、書き込み操作が完了すると、すべてのリーダー スレッドが volatile 変数の更新された値を確認できることが保証されます。volatile キーワードがないと、別のリーダー スレッドが別の値を確認する可能性があります。

小さなJavaプログラムを見せていただけないでしょうか。技術的にも明らかです。

私が理解していることは...揮発性とは、各スレッドアクセス変数が元のコピーと同じ独自のプライベートコピーを持つことを意味します.しかし、スレッドがそのプライベートコピーを変更しようとすると、元のコピーは反映されません.

public class Test1 {  
   volatile int i=0,j=0;  
   public void add1()  
           {  
            i++;  
            j++;  
      }  
   public void printing(){  
       System.out.println("i=="+i+ "j=="+j);  
   }  

    public static void main(String[] args) {  
        Test1 t1=new Test1();  
        Test1 t2=new Test1();  
        t1.add1();//for t1 ,i=1,j=1  
        t2.printing();//for t2 value of i and j is still,i=0,j=0  
        t1.printing();//prints the value of i and j for t1,i.e i=1,j=1  
        t2.add1();////for t2 value of i and j is changed to i=1;j=1  
        t2.printing();//prints the value of i and j for t2i=1;j=1  
    }  

}  

揮発性機能の小さなプログラムを見せていただけないでしょうか。技術的にも明らかです

4

1 に答える 1

1

あなたが読んだように、揮発性変数は可視性を保証しますが、原子性を保証しません-スレッドセーフのもう1つの重要な側面。例で説明しようと思います

public class Counter {
   private volatile int counter;

   public int increment() {
       System.out.println("Counter:"+counter); // reading always gives the correct value
       return counter++; // atomicity isn't guaranteed, this will eventually lead to skew/error in the expected value of counter.
   }

   public int decrement() {
       System.out.println("Counter:"+counter);
       return counter++;
   }
}

この例では、読み取り操作は常に正しいカウンター値を与えることがわかりますが、アトミック操作 (条件を評価して何かを実行し、読み取り値に基づいて読み取りと書き込みを行うなど) はスレッド セーフです。保証されません。

詳細については、この回答を参照してください。

揮発性とは、各スレッド アクセス変数が、元のコピーと同じ独自のプライベート コピーを持つことを意味します。ただし、スレッドがそのプライベート コピーを変更しようとすると、元のコピーは反映されません。

私はあなたを正しく理解しているかどうかわかりませんが、揮発性フィールドは、すべてのスレッドがアクセスできるメインメモリから読み書きされることを意味します.変数のスレッド固有のコピー (キャッシュ) はありません.

JLSから、

フィールドは volatile と宣言される場合があります。その場合、Java メモリ モデルにより、すべてのスレッドが変数の一貫した値を参照できるようになります。

于 2013-02-13T05:52:52.840 に答える