8

Vedere questo answer. Dice:Blocco su un oggetto mutabile - Perché è considerato una cattiva pratica?

Sei esempi veramente cattivi;

...

bloccaggio su un campo mutabile. per esempio. synchronized (object) {object = ...; }

Cosa c'è che non va con il blocco su un campo mutabile? Cosa succede se object è stato dichiarato come final ma non era una classe immutabile?

+1

Penso che tu stia confondendo i campi mutabili con classi immutabili (una classe che contiene solo campi immutabili). –

risposta

14

È una cattiva idea perché se un altro thread cambia il riferimento nella sezione critica, i thread non vedranno più lo stesso riferimento e quindi non si sincronizzeranno sullo stesso oggetto, quindi non saranno controllati. Esempio:

synchronized(lock1) { 
    lock1 = new Object(); 
    sharedVariable++; 
} 

Assumere 2 thread stanno tentando di entrare in questa sezione critica. Il thread 1 entra e il thread 2 attende. Il thread 1 entra, riassegna lo lock1 e procede. Ora il thread 2 vede un lock diverso da quello che ha acquisito il thread 1, che è anche gratuito, quindi può anche entrare nella sezione critica. Segue il divertimento!

Se l'oggetto è final, non è possibile riassegnare il riferimento a un oggetto diverso, pertanto il problema precedente non si applica più.

5

"Mutevole" non è la parola giusta qui. Va bene per bloccare un oggetto mutevole, cioè un oggetto con stato. Ciò che è sbagliato è bloccare un campo, cambiarlo e aspettarsi che un altro thread si blocchi sullo stesso oggetto.

1

Non credo che il blocco di un oggetto mutevole sia di per sé negativo. È davvero molto difficile farlo bene. Esistono altri modelli per l'elaborazione simultanea, come gli attori. Ti suggerisco di esaminare Akka, che può essere utilizzato sia da Java che da Scala, ed è un'implementazione molto solida.