Non sono sicuro se la parola chiave volatile debba essere utilizzata anche per i non primitivi. Ho un membro della classe che viene impostato/assegnato da un thread e accessibile da un altro thread. Devo dichiarare questo membro volatile?java - parola chiave volatile anche per non primitivi
private /* volatile */ Object o;
public void setMember(Object o) {
this.o = o;
}
public Object getMember() {
return o;
}
Qui, setMember (...) viene chiamato da un thread e getMember() viene chiamato da un altro.
Se fosse un booleano, ad esempio, la risposta sarebbe sì.
Sto utilizzando Java 1.4 e il membro in questo caso è di sola lettura. Quindi mi preoccupo solo della visibilità in questo caso, da qui la mia domanda sulla parola chiave volatile.
semplicemente curiosi di scoprire questa dichiarazione - i membri dell'oggetto del campo si riferisce deve anche essere progettato per l'accesso multi-threaded - sarebbe bello se si potesse espandere il motivo per cui è così? – jtkSource
@jtkSource: volatile riguarda solo il campo, ma il campo contiene solo un riferimento. Così volatile assicura che gli altri thread vedano aggiornamenti a quel riferimento, ma se l'oggetto di riferimento non usa volatile o la sincronizzazione correttamente, allora altri thread potrebbero non riuscire a vedere gli aggiornamenti dei campi di quell'oggetto. –
solo a pensarci - quindi se una variabile volatile si riferisce a un oggetto, le variabili non volatili non sarebbero anche rese "visibili" in modo coerente all'interno del contesto dell'oggetto che lo ha dichiarato volatile? Se ci sono altri oggetti che si riferiscono a questo "oggetto riferito" in modo non volatile, solo gli oggetti potrebbero rischiare di non vedere la variabile in uno stato coerente? ci sarebbe una possibilità che ci siano due rappresentazioni dello stesso oggetto in memoria? - Fammi sapere se ho confuso la mia logica. – jtkSource