求问:为什么还要额外创建一个变量指向已有的volatile修饰的变量??

源代码如下:不太明白加粗部分
class CowSubList extends AbstractList {

    /*
     * An immutable snapshot of a sub list's state. By gathering all three
     * of the sub list's fields in an immutable object,
     */
    private volatile Slice slice;

    public CowSubList(Object[] expectedElements, int from, int to) {
        this.slice = new Slice(expectedElements, from, to);
    }

    @Override public int size() {
                    Slice slice = this.slice;
                    return slice.to - slice.from;
    }
            。。。。。。
            }

因为volatile修饰的变量使用时是要从主内存中读取的,而修改后一定要写回主内存,Slice slice = this.slice;表示只从主内存读取一次,然后放到线程的工作内存中,下面的slice.to - slice.from; 就只使用工作内存中的值了。如果this.slice.to-this.slice.from那么要从主内存读取两次,在多线程的环境下,如果to为10,from为5,那么在第一次this.slice.to读取了10后,再读取from之前,另一个线程改变了from的值为7,那么第二次读取from就变为7了,而不是我们想要的5.Slice slice = this.slice就可以解决这个问题。

size() {
Slice slice = this.slice;
return slice.to - slice.from;

                                    就是这句,,不明白为什么要再声明一个slice

因为对volatile变量读写的消耗大于普通变量,所以为了性能考虑,会把volatile变量赋值给普通变量;

如果有帮助,希望采纳...