如果一个对象在初始化过程中对其他线程可见(初始化过程中可见,但尚未完成),这是否可能?如果是,请给予一个简单的例子来支持你的理由?
ktecyv1j1#
这可以通过多种方式实现。
ldfqzlk82#
最好的例子就是众所周知的双重检查锁定习惯用法,我将从它中提取与这个参数相关的部分,看下面的代码:
public class Holder { public static File f; }
在线程A的某个地方执行Holder.f = new File("path");,在线程B的其他地方执行File xxf = Holder.f;并继续使用它。不能保证,即使你读取了对Holder.f的引用,File示例的任何字段都将处于任何定义的状态。你可以读取所有的空值(零、假,取决于类型),以及非空值和空值的任何组合。
Holder.f = new File("path");
File xxf = Holder.f;
Holder.f
File
2条答案
按热度按时间ktecyv1j1#
这可以通过多种方式实现。
ldfqzlk82#
最好的例子就是众所周知的双重检查锁定习惯用法,我将从它中提取与这个参数相关的部分,看下面的代码:
在线程A的某个地方执行
Holder.f = new File("path");
,在线程B的其他地方执行File xxf = Holder.f;
并继续使用它。不能保证,即使你读取了对Holder.f
的引用,File
示例的任何字段都将处于任何定义的状态。你可以读取所有的空值(零、假,取决于类型),以及非空值和空值的任何组合。