说我有以下代码:
public class MyClass
{
private volatile ArrayList<ArrayList<MyImmutableClass>> arraylist = new ArrayList<ArrayList<MyImmutableClass>>();
// ...code...
public void set(ArrayList<ArrayList<MyImmutableClass>> newArraylist)
{
arraylist = newArraylist;
}
public ArrayList<MyImmutableClass> get(int i)
{
return new ArrayList<MyImmutableClass>(arraylist.get(i));
}
}
我意识到通过使arraylist
易变,我实际上并没有使其内容变得易变 - 我只是引用ArrayList<ArrayList<MyImmutableClass>>
对象的volatile。但有一件事我无法完全理解,如果set()
在arraylist
构建get()
中途改变new ArrayList<MyImmutableClass>
的引用会发生什么? {1}}?
我的直觉说没问题 - arraylist.get(i)
传递给ArrayList的复制构造函数的引用不会被更改,arraylist
所持有的引用只会被{{set()
更改。 1}} - 但我无法以这种或那种方式找到明确的答案。
答案 0 :(得分:1)
但有一点我可以完全理解,如果set()通过get()构建新的ArrayList来改变arraylist的引用会发生什么?
调用arraylist.get(i)
并将结果列表传递给new ArrayList<MyImmutableClass>
后,更改arraylist
对该列表没有影响。更改变量的值不会影响对旧值执行的操作的结果。 volatile
实际上与它无关。