【发布时间】:2013-12-28 01:56:27
【问题描述】:
考虑以下类:
public class MyClass
{
private MyObject obj;
public MyClass()
{
obj = new MyObject();
}
public void methodCalledByOtherThreads()
{
obj.doStuff();
}
}
既然 obj 是在一个线程上创建并从另一个线程访问的,那么在调用 methodCalledByOtherThread 时 obj 可以为 null 吗?如果是这样,将 obj 声明为 volatile 是解决此问题的最佳方法吗?将 obj 声明为 final 会有什么不同吗?
编辑: 为了清楚起见,我认为我的主要问题是: 其他线程是否可以看到 obj 已被某个主线程初始化,或者 obj 是否已过时(null)?
【问题讨论】:
-
那么您是在问是否有可能让另一个线程获得对
MyClass类对象的引用在其构造函数完成之前?好问题!不过试试看。尝试在另一个线程上编写代码。 :) -
使用当前代码,不,因为
this引用不会转义构造函数。 -
@SotiriosDelimanolis 您可能应该将其作为答案而不是评论。我认为这个问题非常好,值得一个可以接受的答案。只是一个想法,你可能不同意.....
-
@RayToal 不完全是。我相当肯定这是不可能的。我想知道 methodCalledByOtherThreads 是否可能读取 obj 的陈旧值。
标签: java concurrency thread-safety