2016-06-10 13 views
0

Wie pro mein Verständnis verstehen, wenn ich dann ein ein synchronisiertes Schlüsselwort verwendet haben nur Thread eingeben und wenn es dann nur andere thread.But verlässt, warum mein Code unten gedruckt wird manchmal Erste 2 Zweite 2Kann die Ausgabe

package com.vikash.GeeksForGeeks; 

public class Test implements Runnable{ 

    private static int count; 

    public synchronized void incrementCount() 
    { 
     count++; 
     System.out.println(Thread.currentThread().getName()+" "+count); 
    } 
    public static void main(String[] args) throws InterruptedException { 

     Thread t1=new Thread(new Test()); 
     Thread t2=new Thread(new Test()); 
     t1.start();t1.setName("First"); 
     t2.start();t2.setName("Second"); 
     t1.join(); 
     t2.join(); 
     System.out.println("Count Value="+count); 

    } 
    @Override 
    public void run() { 
     incrementCount(); 
    } 
} 

Antwort

2

Sie erstellen zwei separate Instanzen von Test und Ihre incrementCount Methode ist eine Instanz Methode obwohl es ein statisches Variable erhöht wird.

Jeder Ihrer Threads arbeitet an einer anderen Instanz von Test, so dass sie sich gegenseitig nicht blockieren und Sie unter normalen Rennbedingungen laufen. Wenn Sie incrementCount eine statische Methode machen, versuchen beide Threads, den Monitor für Test.class zu erwerben, und es sollte in diesen Bedingungen funktionieren. (Obwohl es gibt keine Garantie, dass die main Thread die am meisten kürzlich geschriebenen Wert von count lesen ...)

Alternativ erstellen eine Instanz Test, und übergeben, die für beide Thread Bauer, an welcher Stelle sie Beide versuchen, den Monitor für die gleiche Instanz von Test zu erwerben. Der entscheidende Punkt ist, dass, wenn die zwei Threads verschiedene Monitore erwerben, sie beide in der Lage sein werden, ohne auf den anderen zu warten ...

Verwandte Themen