【发布时间】:2016-01-08 08:07:41
【问题描述】:
考虑以下类:
class Ideone
{
private Map<String, String> m;
public Ideone(){
synchronized(this){
m = new ConcurrentHashMap<>();
}
}
public synchronized Map<String, String> getM(){
return Collections.unmodifiableMap(m); //effectively immutable
}
}
为了让其他类观察Ideone的内部状态,我们应该安全地发布它的内部状态(正确同步)。如果我们不这样做,则不能保证另一个线程读取正确的值(不是默认值)。例如:
public volatile Ideone ideone;
public void init(){
ideone = new Ideone();
}
我想如果我们不同步构造和吸气剂,就像
class Ideone
{
private Map<String, String> m;
public Ideone(){
m = new ConcurrentHashMap<>();
}
public Map<String, String> getM(){
return Collections.unmodifiableMap(m); //effectively immutable
}
}
无法保证观察到正确的状态值(例如默认值)。
但正如this answer 中所说,只要允许this 逃逸,这种同步是不可取的。
问题:为什么构造函数中的同步允许this 转义?
【问题讨论】:
标签: java multithreading synchronization