È 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ù.
Penso che tu stia confondendo i campi mutabili con classi immutabili (una classe che contiene solo campi immutabili). –