Ho difficoltà a comprendere le variabili volatili in Java.Le variabili volatili richiedono l'accesso sincronizzato?
ho una classe parametri che contiene una variabile volatile, in questo modo:
public class MyClass<T> {
private volatile T lastValue;
// ... other code ...
}
devo implementare alcune operazioni di base contro lastValue
compreso un get-valore-se-non-nullo.
Queste operazioni devono essere sincronizzate? Posso farla franca con il seguente metodo?
public void doSomething() {
String someString;
...
if (lastValue != null) {
someString += lastValue.toString();
}
}
Oppure è necessario incollare il controllo Null in un blocco sincronizzato?
public void doSomething() {
String someString;
...
synchronized(this) {
if (lastValue != null) {
someString += lastValue.toString();
}
}
}
So che per operazioni atomiche come ottenere e set, dovrei essere ok senza applicare la sincronizzazione (ad es. public T getValue() { return lastValue; }
). Ma non ero sicuro delle operazioni non atomiche.
riscrittura 'someString + = lastValue.toStrin();' come 'someString + = ("" + lastValue);' consente di sbarazzarsi del 'null' controllare tutto. – dasblinkenlight
@dasblinkenlight, true, ma solo se si sta bene con la parola "null" che appare nella stringa risultante quando lastValue è nullo. –
@IanMcLaird Ah, hai ragione, ho dimenticato che Java lo fa (è .NET che non lo fa). – dasblinkenlight