2016-11-10 1 views
0

aufgerufen Hallo kann mir jemand helfen, die Ausgabe des folgenden Snippets zu verstehen?Singleton mit Enum von Threads

Enum -

public enum SingletonEnum { 
    INSTANCE; 
    int num; 

    public void demo(){ 
    System.out.println(num); 
    } 
} 

Hauptklasse -

public static void main(String[] args) {   
    Thread t1 = new Thread(new Runnable(){ 
     public void run(){ 
      SingletonEnum samp = SingletonEnum.INSTANCE; 
      samp.num= 5; 
      samp.demo(); 
     } 
    }); 

    Thread t2 = new Thread(new Runnable(){ 
     public void run(){ 
      SingletonEnum temp = SingletonEnum.INSTANCE; 
      temp.num= 8; 
      temp.demo(); 
     } 
    }); 
    t1.start(); 
    t2.start();  
} 

Die o/p sind 8 und 8 .Allerdings, wenn ich einen privaten Konstruktor in der Enumeration die o/p 5 addieren und 8 Was ist die Logik hinter dem o/p ist 8 und 8.

+0

Das ist wahrscheinlich eine Rennbedingung, d. H. "T2" setzt den Wert 8, bevor 't1' 'demo()' aufruft. Beachten Sie, dass 'samp' und' temp' auf die _exact same_-Instanz verweisen. – Thomas

Antwort

0

Ihr Code ist nicht synchronisiert. Das ist einfach unspezifiziertes Verhalten, man kann in diesem Fall nichts beobachten.

+0

Richtig, gerade begann mit enums auf Singleton zu arbeiten und völlig vergessen, dass die Methoden und alles, was innerhalb einer Enum deklariert wird, nicht threadsicher sind. Ich danke dir sehr . – Mainak