Załóżmy, że mam następującą klasę, która będzie czytana intensywnie, ale tylko zapisywana okazjonalnie. Będzie on wykorzystywany w wielowątkowych aplikacji internetowej, więc to musi być bezpieczne wątek:Synchronizuj dostęp do zapisu do pola Volatile (tanie blokowanie odczytu i zapisu)
public class Foo {
private volatile String foo;
public String getFoo() {
return foo;
}
public synchronized String setFoo(String in) {
this.foo = in;
}
}
Java współbieżności (http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html) stwierdza, że jest to delikatny sposób, aby chronić dostęp do zapisu przy jednoczesnej poprawie odczytu. Czym jest silniejsza alternatywa dla tego wzoru? Lub jakąś alternatywę, jeśli foo będzie wymagało zmiany w środowisku ciężkim dla odczytu? Dziękuję Ci.
Oznaczenie zmiennej jako lotnej nie powoduje, że wątek jest bezpieczny. Jeśli wszystko, co robi OP, to czytanie/zapisywanie, to efektywnie jest bezpieczne dla wątków (nie byłoby to prawdą, gdyby wiele wątków zwiększało wartość zmiennej bazowej ...). –
Czy jest więc jakaś sytuacja, w której zarówno lotny, jak i zsynchronizowany byłby odpowiedni? – oberger
Jestem pewien, że nie ma takiej sytuacji. Jeśli zsynchronizujesz dostęp do pola, lotny jest zbędny. –