对象构造函数中设置的对象状态是否可见所有线程?

时间:2013-07-18 11:13:00

标签: java concurrency constructor final

例如 -

public class Request {
    public String id; //is it visible to other threads after construction?
    public Request(String id){
        this.id= id;
    }   
}

1 个答案:

答案 0 :(得分:3)

因为它是你的类不是线程安全的,即使在构造函数完成之后,线程也可以观察到id的空值。

为了确保构造后所有线程都可以看到id,您有几种可能性:

  • 制作字段final
  • 制作字段volatile
  • 安全发布Request对象。

安全出版习语包括:

  • 从静态初始化程序初始化实例
  • 将对实例的引用标记为volatile
  • 将对实例的引用标记为最终
  • 同步所有访问

另请参阅this other post,其中解释了标记字段final以确保不可变对象的线程安全的重要性。