复制易失性ArrayList的元素

时间:2017-09-01 21:38:29

标签: java multithreading arraylist

说我有以下代码:

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}} - 但我无法以这种或那种方式找到明确的答案。

1 个答案:

答案 0 :(得分:1)

  

但有一点我可以完全理解,如果set()通过get()构建新的ArrayList来改变arraylist的引用会发生什么?

调用arraylist.get(i)并将结果列表传递给new ArrayList<MyImmutableClass>后,更改arraylist对该列表没有影响。更改变量的值不会影响对旧值执行的操作的结果。 volatile实际上与它无关。