Wird String get / set threadsafe?

7

Sagen wir, ich habe Folgendes,

%Vor%

Sind diese Methoden aufgrund der unveränderlichen Natur der Klasse String automatisch threadsicher oder ist ein Sperrmechanismus erforderlich?

    
mre 25.02.2013, 17:17
quelle

4 Antworten

18

Nein, das ist kein Threadsicher. Foo ist änderbar. Wenn Sie also sicherstellen möchten, dass verschiedene Threads denselben Wert von bar sehen - also Konsistenz - entweder:

  • Machen Sie bar volatile oder
  • Machen Sie die Methoden synchronized oder
  • Verwenden Sie AtomicReference<String> .

Die Lese- und Schreibvorgänge von bar sind selbst atomar, aber Atomizität ist keine Threadsicherheit.

Ссылка

Für eine ausführliche Darstellung der Parallelität von Java sollten Sie sich eine Kopie von Java Concurrency in Practice (JCIP) besorgen .

    
Matt Ball 25.02.2013, 17:18
quelle
7

Sie setzen Verweise, und daher spielt die Unveränderlichkeit von String keine Rolle. Sie beeinflussen nicht den Inhalt von String .

    
Brian Agnew 25.02.2013 17:19
quelle
4

Nein, nicht sicher.

Dies ist Foo veränderbares Verhalten; Die Unveränderlichkeit der Zeichenfolge geht nicht auf Foo zurück.

%Vor%     
duffymo 25.02.2013 17:18
quelle
3

Nein, es ist nicht threadsicher.

Solange String unveränderlich ist, kommt das Problem aus dem Feld Foo . Um dies deutlicher zu machen, betrachten Sie zum Beispiel eine Methode, deren Aufgabe es wäre, den Wert von bar zu anhängen (anstatt ihn zu ersetzen). Wenn es von mehreren Threads aufgerufen wird, können einige Schreibvorgänge verloren gehen. Das Gleiche (verlorene Schreibvorgänge) kann auch mit Ihrem einfachen Setter passieren, auch wenn es in diesem Fall zunächst nicht offensichtlich ist.

    
quelle