这是一个坏主意,因为如果另一个线程更改了关键部分中的引用,则这些线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。例:
synchronized(lock1) { lock1 = new Object(); sharedVariable++; }假设有2个线程试图进入此关键部分。线程1进入,线程2等待。线程1进入,重新分配
lock1并继续。现在,线程2看到的锁与线程1获得的锁不同,后者也是免费的,因此它也可以进入关键部分。随之而来的是有趣!
如果对象为
final,则无法将引用重新分配给其他对象,因此上述问题不再适用。



