2016-05-11 13 views
-3

ich ein Singletonklasse wie diese haben:synchronisierte Methode nicht blockiert andere Threads

private static StringsHandler INSTANCE = null; 
private int count = 0; 
//I have 2 methods so I don't have to be sending nulls to getInstance 
//once it's created 
public static void createInstance(List<String> strings){ 
    if(StringsHandler.INSTANCE == null) 
     StringsHandler.INSTANCE = new StringsHandler(strings); 
} 

public static StringsHandler getInstance(){ 
    return StringsHandler.INSTANCE; 
} 

public synchronized File use(){ 
    count++; 
    System.out.println("threads using .use " + count); 
    while(true){} //Keep the thread here so count should stay as 1 
} 

Instanz über die Anwendung Hauptklasse erstellt wird, main-Methode wie folgt aus:

if(stringList.isEmpty()){ 
     LOGGER.error("List was empty"); 
     System.exit(0); 
    } 
StringsHandler.createInstance(stringList); 

Und ich rufe es so etwas wie dies mit:

list.parallelStream().forEach(element -> { 
    SingletonClass.getInstance().use(); 
}); 

Dieses threads using .use 1 drucken soll, aber er druckt threads using .use 5 Warum erlaubt das synchronisierte Keyword mehr als 1 Thread?

+5

Haben Sie mehr als ein Objekt? –

+0

Wie nennst du das? – bcsb1001

+0

Bearbeitet, um Ihre Fragen zu beantworten –

Antwort

2

Das Schlüsselwort synchronized ermöglicht nur einem Thread, das bestimmte Objekt zu sperren, auf dem es verwendet wird. Wenn Sie also mehr als eine Instanz dieses Objekts haben und use auf mehreren gleichzeitig aufrufen, können sie gleichzeitig ausgeführt werden.

Es liegt in Ihrer Verantwortung, eine Zuordnung von Datenelementen zu Ausschlussmethoden zu bestimmen und konsequent durchzusetzen. Wenn mehr als eine Ausschlussmethode dasselbe Datenelement schützt, erhalten Sie keinen korrekten Ausschluss.

+0

Vergessen zu erwähnen, dass ich eine Singleton-Klasse verwendet habe, eine bearbeitete Frage. –

+0

Protokollieren Sie den Objektbezeichner bei der Eingabe von 'use' und Sie werden sehen, dass sie nicht das gleiche Objekt sind. –

+0

Solange "count" nicht als "static" deklariert ist, sollte immer noch kein Thread einen Wert von "5" ausgeben. Es sei denn, es gibt einen anderen Code, der die Variable manipuliert ... – Holger