volatile是否传播给实例成员?

Ale*_*kin 3 java multithreading volatile

假设有一些简单的容器声明并像这样实例化

class Test {
    private volatile List<Object> list = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

,读取和写入都由锁保护; synchronized关键字未使用.尽管Test.list声明为volatile,但它的成员字段都不ArrayList.elementData具有此修饰符.现在,在多线程应用程序中,它会像volatile容器一样吗?换句话说,ArrayList.elementData某些线程提交的更改是否会被所有其他线程立即看到?

man*_*uti 5

一般的答案是否定的:volatile只在读取和写入引用变量之间建立一个先发生的关系.如果两个线程同时访问变量中引用的对象的内部字段,则仍然需要同步机制.

在您的情况下,最好的方法似乎是使用同步列表,或java.util.concurrent包中的一些包装器.