No es una buena idea porque si otro hilo cambia la referencia en la sección crítica, los hilos ya no verán la misma referencia, por lo que no se sincronizarán en el mismo objeto, por lo tanto se ejecutarán sin control. Ejemplo:
synchronized(lock1) {
lock1 = new Object();
sharedVariable++;
}
Supongamos que hay 2 hilos intentando ingresar a esta sección crítica. El hilo 1 entra y el hilo 2 espera. El hilo 1 entra, reasigna lock1
y procede. Ahora el hilo 2 ve un bloqueo diferente de lo que el hilo 1 adquirió, que también es libre, por lo que también puede ingresar a la sección crítica. ¡La diversión sigue!
Si el objeto es final
, no puede reasignar la referencia a un objeto diferente, por lo que el problema anterior ya no se aplica.
Creo que confunde campos mutables con clases inmutables (una clase que contiene solo campos inmutables). –