【发布时间】:2017-03-31 10:47:44
【问题描述】:
假设我有一个对象如下:
Map<String, String> m = new HashMap<>();
然后我在这个对象上同步如下并更改它的引用:
synchronize(m){
m = new HashMap<>();
}
使用这段代码,m 上的锁会发生什么?更新 m 表示的新对象是否仍然安全?还是锁定本质上是在旧对象上?
【问题讨论】:
-
这不安全 - 你可能会在另外 2 个线程之间发生竞争,其中一个线程已经阻塞等待旧的
m,另一个线程获得了新的m的锁定。出于这个原因,锁对象通常与保存数据的对象分开。
标签: java multithreading concurrency synchronized synchronized-block