假设我有一个可变类类型Foo
的原子引用:
AtomicReference<Foo> foo = new AtomicReference<Foo>(new Foo());
线程A写入Foo
对象:
foo.get().write(42);
线程B从Foo
对象读取:
int x = foo.get().read();
请注意,原子引用本身永远不会被修改!也就是说,我不会在我的代码中调用foo.set
。
线程B是否可以保证观察线程A最后写入的值?
答案 0 :(得分:3)
线程B是否保证观察到最后写入的值 线程A?
没有。它等同于:
volatile Foo foo = new Foo();
foo.write(42);
在foo为非null之后,在foo初始赋值之前发生的所有写操作都将可见。之后,无法保证线程何时会看到foo.write(42)
的写入。
答案 1 :(得分:1)
没有
通过访问特定的原子实例,你不能简单地使X线程安全。
为了使其成为线程安全的,你必须使底层类本身是线程安全的,而不仅仅是访问它。