Ste*_*rts 2 java concurrency thread-safety
考虑以下课程:
public class MyClass
{
private MyObject obj;
public MyClass()
{
obj = new MyObject();
}
public void methodCalledByOtherThreads()
{
obj.doStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
由于obj是在一个线程上创建并从另一个线程访问的,因此当调用methodCalledByOtherThread时,obj可能为null吗?如果是这样,将obj声明为volatile是解决此问题的最佳方法吗?声明obj作为最终会有什么不同吗?
编辑:为清楚起见,我认为我的主要问题是:其他线程是否可以看到obj已经被某个主线程初始化或者obj可能是陈旧的(null)?
对于methodCalledByOtherThreads由另一个线程调用并导致问题,该线程必须获得对其字段未初始化的MyClass对象的引用obj,即.构造函数尚未返回的位置.
如果您this从构造函数中泄漏了引用,则可以执行此操作.例如
public MyClass()
{
SomeClass.leak(this);
obj = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)
如果该SomeClass.leak()方法启动一个单独的线程调用methodCalledByOtherThreads()的this引用,那么问题就出来了,但不管这是事实volatile.
由于你没有我上面描述的内容,你的代码很好.
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |