Nehmen wir an, ich habe die folgende Klasse, die schwer gelesen werden, aber nur gelegentlich geschrieben. Es wird in einem Multi-Threaded-Web-App verwendet werden, so dass es Thread-sicher sein muss:Synchronisieren Schreibzugriff auf flüchtige Feld (Günstige Lese-Schreib-Block)
public class Foo {
private volatile String foo;
public String getFoo() {
return foo;
}
public synchronized String setFoo(String in) {
this.foo = in;
}
}
Java Concurrency (http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html) heißt es, dass dies eine fragile Weise ist Schreibzugriff zu schützen, während des Lesezugriff zu verbessern. Was ist eine stärkere Alternative zu diesem Muster? Oder irgendeine Alternative, wenn foo in einer lese-schweren Umgebung veränderbar sein soll? Vielen Dank.
Das Markieren einer Variablen als flüchtig macht es nicht threadsicher. Wenn das ganze OP das Lesen/Schreiben macht, dann ist es threadsicher (dies wäre nicht wahr, wenn mehrere Threads die Unterstützungsvariable inkrementieren würden ...). –
Also gibt es eine Situation, in der sowohl volatile als auch synchronisierte angemessen wären? – oberger
Ich bin sicher, dass es keine solche Situation gibt. Wenn Sie den Zugriff auf ein Feld synchronisieren, ist volatile redundant. –