2017-08-08 76 views
0

我在這裏得到了一個promblem! 後面的代碼給出了我無法理解的輸出。同步代碼與意想不到的輸出

我得到2個整數:count和lock。如果我同步「鎖定」(如代碼中顯示的那樣),則輸出顯示「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

您沒有使用相同的鎖,因爲你正在改變整數,一個新的對象被每一次創造了你是增加鎖,只是使用一個新的對象,不要改變。