【发布时间】:2014-08-29 19:13:20
【问题描述】:
想象一下我们有
volatile int publisher = 0;
volatile List<String> list = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
volatile String[] array = {"Buenos Aires", "Córdoba", "La Plata"};
据我所知。
列表和数组中的初始值已正确发布,并且对所有读取线程可见。
初始化后添加的所有值都不是安全发布的。
我们仍然可以使用
安全地阅读和发布它们//in Thread 1
list.add("Safe City");
array[2] = "Safe city";
publisher = 1;
//in Thread2
if(publisher == 1) {
String city = list.get(3);
city = array[2];
}
我说的对吗?
【问题讨论】:
-
请注意,
volatile关键字适用于列表或数组变量本身,而不适用于列表或数组的内容。 -
不清楚你在这里问什么。对于原语,
volatile指的是原语值本身。对于对象,volatile关键字仅指引用,而不是引用的对象。所以对于list和array,volatile对列表或数组的内容没有任何影响。volatile并没有像你想象的那样做。 -
@JimGarrison 在 Java 1.5 和更新版本中,volatile 保证了在分配给 volatile 之前所做的所有更改的可见性,而不仅仅是 vloatile 本身的更改。所以它可能是相关的。
-
请注意,您不能在
Arrays.asList返回的List中添加或删除元素;您只能设置元素而不更改列表的大小。不过,这与您询问的内存模型问题几乎无关。
标签: java collections concurrency volatile java-memory-model