2012-04-25 1 views
-1

Je suis novice en matière de threads et d'apprentissage. Pourquoi cette donnée est-elle en course? Je sais comment le faire en utilisant la méthode Synchronized(){} mais pas avec le modificateur.Pourquoi les données de ce fil de course?

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

double possible [Apprendre à utiliser les threads qui empêchent les données conditions de course] (http: // stackoverflow.com/questions/10309015/learning-to-use-threads-that-prevent-data-race-conditions) – Gray

+1

C'est le même problème mec. Vous synchronisez sur un objet différent à chaque fois. Cette fois, vous synchronisez sur la méthode qui synchronise sur chacun des différents objets 'SyncMethodDataRace'. Vous devez synchroniser sur un seul objet, laissez-moi répondre à votre autre question. – Gray

+0

Lorsque vous synchronisez la méthode, cela revient à mettre le contenu de la méthode dans un bloc 'synchronized (this)'. – jpm

Répondre

3

En faisant méthode runsynchronized vous n'avez pas atteint la synchronisation souhaitée. Une méthode synchronisée se verrouille sur l'instance actuelle de la classe. Dans votre exemple, aucun autre thread n'appelle la méthode run d'un autre thread, donc il n'y a pas de blocage.

Dans votre cas, vous avez probablement besoin d'un objet statique qui est partagée entre toutes les instances de synchroniser sur, à savoir:

private static Object syncObject = new Object(); 

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