2012-04-04 5 views
1

Ich habe folgendes Stück Code:Thema Sicherheit auf HashMap.toString() Methode

public Hashmap<String,String> tempmap = new HashMap<String,String>(); 

und eine Klasse-Funktion:

void f1(){ 
    synchronized(onClassVariable1){ 
    ....Some code onClassVariable1... 
    String tempString = tempMap.toString(); 
    ... Some work onClassVarible1 and tempString ... 
    } 
    } 

Multiple-Thread Aufruf dieser Funktion f1 durch ein Objekt dieser Klasse ..

ist diese Funktion thread-sicher?

+0

Sie können 'Collections.synchronizedMap (tempmap)' verwenden, um eine threadsichere Map zu erhalten. – Stephan

+0

Beachten Sie, dass Sie den synchronisierten Block so kurz wie möglich machen sollten. Wenn Sie mit tempMap fertig sind, beenden Sie den Block, und Sie können den String außerhalb des Blocks bearbeiten. –

Antwort

6

Es hängt davon ab, ob es Methoden gibt, die nicht auf onClassVariable1 synchronisieren und ändern.

+0

Um zu verdeutlichen, dass "onClassVariable1" Thread-sicher ist, müssen alle Schreibvorgänge in der Map innerhalb synchronisierter Blöcke (die auf demselben Objekt synchronisieren) erfolgen. Zum Beispiel können Thread-A & Thread-B, die 'f1 'gleichzeitig aufrufen, den synchronisierten Block innerhalb von' f1 'nicht gleichzeitig eingeben. Angenommen, Sie haben eine andere Funktion 'f2' in einer anderen Klasse, die' onClassVariable1' außerhalb eines synchronisierten Blocks ändert. Dann kann ein Thread-C die HashMap ändern, während sich ein anderer Thread innerhalb des synchronisierten Blocks in 'f1' befindet – Cod3Citrus

0

Nothing in HashMap threadsicher ist, und die Javadoc- so sagt: „Wenn mehrere Threads gleichzeitig eine Hash-Karte zuzugreifen, und mindestens einer der Threads ändert die Karte strukturell, muss es extern synchronisiert werden.“

Verwandte Themen