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

求问:为什么还要额外创建一个变量指向已有的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就可以解决这个问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试