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.