2017-03-22 11 views
-3

私は以下のコードを実行して20000とカウントします。私はカウントをvolatileと宣言しましたが、出力は常に適切ではありません。揮発性と同期の差

package threading; 

public class Demo5 { 
    private volatile int count =0; 
    public static void main(String[] args){ 
     Demo5 d = new Demo5(); 
     d.doWork(); 
    } 

    public void doWork(){ 
     Thread t1 = new Thread(new Runnable() { 
      public void run() { 
       for(int i=0; i<10000; i++){ 
        count++; 
       } 

      } 
     }); 
     Thread t2 = new Thread(new Runnable() { 
      public void run() { 
       for(int i=0; i<10000; i++){ 
        count++; 
       } 

      } 
     }); 
     t1.start(); 
     t2.start(); 

     try{ 
      t1.join(); 
      t2.join(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(count+" is count"); 
    } 
} 

後で同期メソッド内に入れて同期をとってみましたが正常に動作していました。

public synchronized void increment(){ 
     count++; 
    } 

私たちがいつ揮発性のために移動する必要があるのか​​、同期するタイミングを教えてもらえますか?

+0

'count()'メソッドは何をしますか? –

+0

これはタイプミスです。修正されました。 –

答えて

1

​​には、同じクリティカルセクションにインクリメントとセット操作が含まれています。 volatileでは、インクリメントとセットは別々に保護されていました。つまり、あるスレッドがインクリメントし、次に他のスレッドが設定され、次にインクリメントされる順序と同じではなく、もう一方のスレッドが設定されます。 volatileは、単一のアクションのみを調整できます。​​は一連のアクションを調整できます。