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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)