Diciamo che ho la seguente classe che verrà letta pesantemente, ma solo scritta occasionalmente. Sarà usato in una web app multi-threaded, quindi ha bisogno di essere thread-safe:Sincronizza accesso in scrittura al campo Volatile (blocco di lettura/scrittura economico)
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) afferma che questo è un modo fragile per proteggere l'accesso in scrittura, migliorando l'accesso in lettura. Qual è un'alternativa più forte a questo modello? O qualsiasi alternativa se foo avrà bisogno di essere trasformato in un ambiente pesante da leggere? Grazie.
Contrassegnare una variabile come volatile non lo rende thread-safe. Se tutto ciò che l'OP sta facendo è la lettura/scrittura, allora in effetti è thread-safe (questo non sarebbe vero se più thread stavano incrementando la variabile di supporto ...). –
Quindi c'è qualche situazione in cui sia volatile che sincronizzato sarebbe appropriato? – oberger
Sono sicuro che non esiste una situazione del genere. Se si sincronizza l'accesso a un campo, volatile è ridondante. –