xx23x
2017-04-01 06:37
采纳率: 33.3%
浏览 865
已采纳

求问:为什么还要额外创建一个变量指向已有的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;
    }
            。。。。。。
            }
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 逗比123号 2017-04-01 07:21
    已采纳

    因为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就可以解决这个问题。

    已采纳该答案
    打赏 评论
  • xx23x 2017-04-01 06:35

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

                                        就是这句,,不明白为什么要再声明一个slice
    
    打赏 评论
  • little_how 2017-04-01 07:09

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

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

    打赏 评论

相关推荐 更多相似问题