2017-08-08 5 views
0

私はここに宣言を得ました! コードの背後には私が理解できない出力があります。予期しない出力を伴う同期化されたコード

私は2つの整数を得ました:カウントとロック。私が "ロック"(コードに表示されているように)で同期した場合、 "count"が期待通りに追加されているが、 "lock"が間違って追加されていることが出力によって示されます。
これはなぜ発生しましたか?
私はそれを同期すると私は "ロック"を変更することはできません?ここで

はコードです:

public class SynchronizedTest implements Runnable { 

    static Integer count = new Integer(0); 
    static Integer lock = new Integer(0); 
    private int threadIndex = -1; 

    public SynchronizedTest(int threadIndex) { 
     this.threadIndex = threadIndex; 
    } 

    @Override 
    public void run() { 
     System.out.println("in"); 
     for (int i = 0; i < 10; ++i) { 
      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      synchronized (SynchronizedTest.lock) { 
       count++; 
       lock++; 
       System.out.println("Thread " + threadIndex + ": " + count); 
       System.out.println("Thread " + threadIndex + " lock : " + lock); 
      } 
     } 
     System.out.println("out"); 
    } 

    public static void main(String[] args) { 
     for (int i = 0; i < 5; ++i) { 
      SynchronizedTest threadTest = new SynchronizedTest(i); 
      Thread thread = new Thread(threadTest); 
      thread.start(); 
     } 
    } 
} 

出力されます:

in 
in 
in 
in 
in 
Thread 4: 1 
Thread 4 lock : 1 
Thread 0: 2 
Thread 0 lock : 2 
Thread 1: 3 
Thread 3: 4 
Thread 1 lock : 4 
Thread 3 lock : 4 
Thread 2: 5 
Thread 2 lock : 5 
Thread 1: 6 
Thread 1 lock : 6 
Thread 3: 7 
Thread 3 lock : 7 
Thread 4: 8 
Thread 2: 10 
Thread 0: 9 
Thread 2 lock : 10 
Thread 4 lock : 10 
Thread 0 lock : 10 
Thread 1: 11 
Thread 0: 14 
Thread 0 lock : 14 
Thread 2: 13 
Thread 2 lock : 14 
Thread 3: 12 
Thread 3 lock : 14 
Thread 1 lock : 14 
Thread 4: 15 
Thread 4 lock : 15 
Thread 0: 16 
Thread 0 lock : 16 
Thread 2: 17 
Thread 1: 19 
Thread 1 lock : 19 
Thread 3: 18 
Thread 3 lock : 19 
Thread 2 lock : 19 
Thread 4: 20 
Thread 4 lock : 20 
Thread 1: 21 
Thread 1 lock : 21 
Thread 2: 22 
Thread 0: 23 
Thread 2 lock : 23 
Thread 0 lock : 23 
Thread 3: 24 
Thread 3 lock : 24 
Thread 4: 25 
Thread 4 lock : 25 
Thread 1: 26 
Thread 1 lock : 26 
Thread 2: 27 
Thread 3: 29 
Thread 0: 28 
Thread 3 lock : 29 
Thread 2 lock : 29 
Thread 0 lock : 29 
Thread 4: 30 
Thread 4 lock : 30 
Thread 1: 31 
Thread 1 lock : 31 
Thread 3: 32 
Thread 0: 33 
Thread 3 lock : 33 
Thread 0 lock : 33 
Thread 2: 34 
Thread 2 lock : 34 
Thread 4: 35 
Thread 4 lock : 35 
Thread 1: 36 
Thread 1 lock : 36 
Thread 3: 37 
Thread 3 lock : 37 
Thread 2: 39 
Thread 0: 39 
Thread 2 lock : 39 
Thread 0 lock : 39 
Thread 4: 40 
Thread 4 lock : 40 
Thread 1: 41 
Thread 1 lock : 41 
Thread 3: 42 
Thread 0: 43 
Thread 3 lock : 43 
Thread 0 lock : 43 
Thread 2: 44 
Thread 2 lock : 44 
Thread 4: 45 
Thread 4 lock : 45 
Thread 1: 47 
Thread 2: 49 
Thread 2 lock : 49 
Thread 0: 48 
Thread 3: 47 
Thread 3 lock : 49 
out 
Thread 0 lock : 49 
out 
out 
Thread 1 lock : 49 
out 
Thread 4: 50 
Thread 4 lock : 50 
out 
+1

あなたはそれを変更しているので、 'lock'で同期することはできません(そして' Integer'は不変です。実際には常に新しい 'lock'オブジェクトを作成しています)。ロックオブジェクトは通常、 'private final Object lock = new Object();'の形式です。 – Kayaman

答えて

0

あなたは、新しいオブジェクトをするたびに作成されている、あなたは整数に変更されているので、同じロックを使用していませんロックを増やし、新しいオブジェクトを使用して変更しないでください。