3

例如 -

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

1 回答 1

3

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

为了确保id在构造后对所有线程可见,您有几种可能性:

  • 使领域final
  • 使领域volatile
  • 安全地发布Request对象。

安全出版习语包括:

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

另请参阅这篇文章,它解释了将字段标记为 final 以保证不可变对象的线程安全的重要性。

于 2013-07-18T11:30:38.040 回答