2012-04-25 46 views
-1

我是新來的線程和學習。爲什麼這個數據競賽?我知道如何使用Synchronized(){}方法來做到這一點,但不是修改器。這是爲什麼線程數據競賽?

public class SyncMethodDataRace extends Thread { 

    private static int common = 0; 

    public synchronized void run(){ 
     int local = common; 
     local++; 
     common = local; 
    } 


    public static void main(String[] args) throws InterruptedException { 
     SyncMethodDataRace[] allThreads = new SyncMethodDataRace[20000]; 

     for(int i = 0; i < allThreads.length; i++){ 
      allThreads[i] = new SyncMethodDataRace(); 
     } 

     for(SyncMethodDataRace d: allThreads){ 
      d.start(); 
     } 

     for(SyncMethodDataRace d: allThreads){ 
      d.join(); 
     } 

     System.out.println(common); 
    } 
} 
+1

[學習使用,可以防止數據競爭條件線程] HTTP(可能重複:// stackoverflow.com/questions/10309015/learning-to-use-threads-that-prevent-data-race-conditions) – Gray 2012-04-25 04:02:09

+1

這是同一問題的傢伙。您每次都在同一個不同的對象上進行同步。這次您正在同步每個不同'SyncMethodDataRace'對象的方法。您需要同步一個對象,讓我回答您的其他問題。 – Gray 2012-04-25 04:04:14

+0

當你同步這個方法時,它和把這個方法的內容放在'synchronized(this)'塊中一樣。 – jpm 2012-04-25 04:18:24

回答

3

通過使run方法​​你沒有達到預期的同步。同步方法鎖定類的當前實例。在你的例子中,沒有其他線程調用另一個線程的run方法,所以沒有阻塞。

在你的情況,你可能需要的是所有實例之間共享的靜態對象進行同步的,即:

private static Object syncObject = new Object(); 

public void run() { 
    synchronized (syncObject) { 
     //.... 
    } 
}