Mur*_*zen 8 java concurrency multithreading synchronized thread-safety
看到这个答案.它说:
六个非常糟糕的例子;
...
锁定可变字段.例如synchronized(object){object = ...; }
锁定可变字段有什么问题?如果object
被声明为final
但不是不可变类?
Tud*_*dor 14
这是一个坏主意,因为如果另一个线程更改了临界区中的引用,则线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行.例:
synchronized(lock1) {
lock1 = new Object();
sharedVariable++;
}
Run Code Online (Sandbox Code Playgroud)
假设2个线程正在尝试进入此关键部分.线程1进入,线程2等待.线程1进入,重新分配lock1
并继续.现在,线程2看到的锁不同于线程1获取的锁,这也是免费的,因此它也可以进入临界区.随之而来的乐趣!
如果对象是final
,则无法将引用重新分配给其他对象,因此上述问题不再适用.