What happens when two threads are trying to generate a new shared state?
Siamo chiari su quello che capisco che la tua domanda sia:
Hai una variabile mutabile di stato immutabile. Usiamo un int per semplicità:
int x = 42;
Quindi vuoi che due thread cerchino entrambi di incrementare x
di 1.
Quindi puoi sincronizzarli. L'immutabilità fornisce poco valore qui.
Tutte le garanzie di immutabilità è che la variabile da cui stai leggendo non è in uno stato a metà strada quando viene letta. Poiché x
è atomico, questo non ha molto senso. Qualsiasi lettura che fai otterrà l'intero valore.
Ma dal momento che hai mutato la variabile x
, hai bisogno di sincronizzazione anche se il valore è immutabile. Ogni thread sta effettuando 2 operazioni atomiche:
y = read x;
write x with y+1;
Se entrambi i thread leggono prima di scrivere, allora entrambi i thread vedranno x
, non x+1
. Quindi è necessario sincronizzare le cose
Ma cosa succede se x
era una coppia?
Pair x = {2,4};
Quindi avere coppie immutabili garantirà che entrambi i valori vengano modificati allo stesso tempo.
Ma i thread hanno 4 operazioni atomiche con coppie mutabili
y = read x.x;
write x.x with y+1;
y = read x.y;
write x.y with y+1;
Ciascuno di essi può essere interrotto a seconda della concorrenza dei thread. Con le coppie immutabili , ti costringe a fare qualcosa del genere:
tmp = x;
y = new Pair(tmp.x+1, tmp.y+1);
x = y;
Hai ancora bisogno di sincronizzazione, perché hai la variabile mutevole x
, ma la copia di riferimento su tmp
è atomica. Poiché tmp
è locale e sai che non viene modificato, it non ha bisogno di essere sincronizzato anche se stai facendo due operazioni diverse (per leggere tmp.x
e tmp.y
).
Se pensi a come gli oggetti sono usati, la maggior parte del tempo, vuoi solo fare uno snapshot e fare alcune operazioni su di esso. Se non stavi aggiornando x
sopra, non avresti bisogno di sincronizzazione. La copia in tmp
avverrà automaticamente quando passi x
in una funzione.
Ma dal momento che stavi chiedendo specificamente sull'aggiornamento di un riferimento mutabile, non ottieni i benefici dell'immutabilità. Se il riferimento era anche di sola lettura, non sarebbe necessario sincronizzare nulla poiché nulla può cambiare.