2016-06-17 100 views
0

我使用「for」循環生成100個線程來打印出數據0〜4。For循環生成的多線程不能使用同步?

public class ThreadTest implements Runnable { 
    static volatile int threadNum = 100; 
    public void run() { 
     synchronized (this) { 
      for (int i = 0; i < 5; i++) { 
       System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     for (int i = 0; i < threadNum; i++) { 
      ThreadTest t = new ThreadTest(); 
      Thread t1 = new Thread(t); 
      t1.start(); 
     } 
    } 
} 

我曾經希望爲每個線程獲取數據0〜4,因爲「synchronized」只允許一個線程操作「for」循環。但是,打印結果並不如我預期的那樣。

enter image description here

誰能幫我指向我們我的問題是什麼?謝謝〜

+4

提示:避免張貼屏幕截圖。你的輸出是「純文本」;所以你簡單地複製/粘貼該文本會容易得多。 – GhostCat

回答

3

這是因爲你synchronize對當前ThreadTest實例的訪問(使用synchronized (this)),你必須每個線程一個這樣的實例,以便它是無用的,則應該像類例如作爲普通互斥同步我們只有一個類的例子作爲下一個:

synchronized (ThreadTest.class) { 
    for (int i = 0; i < 5; i++) { 
     System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
    } 
} 
+0

根據您的建議修改我的代碼後,問題就解決了。謝謝! –

1

一切都在這裏預計。

問題是:您的每個ThreadTest對象都在其這個指針上同步。

當你給100人100匙和100碗,並告訴他們開始吃東西時,你希望發生什麼?也許,如果你一共只有一把勺子給100人,那會改變什麼嗎?

長話短說:你必須同步一個對象,而不是100個不同的對象。