dire che hai questo codice:In un blocco sincronizzato Java, le scritture sono visibili su tutti i campi o solo sulla variabile sincronizzata?
private String cachedToken;
private final Object lockObject = new Object();
....
retrieveToken(){
synchronized(lockObject){
if (cachedToken == null){
cachedToken = goGetNewToken();
}
return cachedToken;
}
}
disposta la scrittura per cachedToken
essere visibile a tutte le discussioni che si sono bloccati su lockObject
?
Sì, questo è il punto ... Ma la scrittura potrebbe accadere alla cache della CPU l1 o l2 e non essere scaricata nella memoria principale prima che un altro thread ottenga il blocco. –
Non è vero. Se un altro thread si blocca su 'lockObject' dopo che un altro thread ha scritto e poi esce, il thread in entrata vedrà la scrittura. –
Nota: le scritture sulla "variabile sincronizzata" sono spesso * errate *. Il codice è sincronizzato su un oggetto, non su una variabile. Se la variabile viene modificata midstream per fare riferimento a un oggetto diverso, più blocchi sincronizzati sull'oggetto a cui fa riferimento tale variabile potrebbero essere eseguiti contemporaneamente. –