• 菠萝炒辣条

    @翟陆续,您好!关于本书的2.4章节关于内存可见性问题的分析,有个疑惑请教下:线程B在修改X的值为2后将新值存放到线程2所在的一级Cache和共享二级Cache,线程B在刷一级Cache的时候,线程A的一级Cache不会失效么,根据缓存一致性协议MESI?线程A和线程B读X的时候,应该是同一个缓存行吧。麻烦大神抽空给予回复,谢谢!

    菠萝炒辣条发表于 2020/7/9 16:41:50
    • fly2008

      你好,根据作者描述,线程A、B分别在不同的cpu上执行,1级cache属于各CPU私有,所以缓存不同

      fly2008发表于 2023/8/7 17:48:12
  • 执迷不悟

    书中66页底部讲到 volatile关键字可以保证内存可见性和避免重排序
    那么假设如下变量顺序

    a
    b
    volatile c
    d
    e

    是c前后都不会重排序了吗?还是{a, b可以随便动,c不动, d, e可以随便动}
    恳请作者给出解释,感谢!

    执迷不悟发表于 2020/3/20 1:20:01
    • 翟陆续

      volatile具有下面happen-before语义,来避免指令重排序:

      当修改一个volatile变量时候,可以保证其前面对其他变量的读写操作,不会被重排序到写volatile变量操作后面。
      读取一个volatile变量时候,可以保证其后面对其他变量的读写操作,不会被重排序到读volatile变量前面

      翟陆续发表于 2020/7/4 11:32:11
  • hyl08

    书中第二章 讲指令重排的代码 为什么自己运行多次后的结果没有出现为0的结果 代码和书中的一致

    `public static void main(String[] args) throws Exception {
    ReadThread read = new ReadThread();
    WriteThread write = new WriteThread();
    read.start();
    write.start();
    Thread.sleep(10);
    read.interrupt();
    }

    private static int num = 0;
    private static boolean ready = false;
    
    static class ReadThread extends Thread {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                if (ready) {
                    System.out.println(num + num);
                }
            }
            System.out.println("read over");
        }
    }
    
    static class WriteThread extends Thread {
        @Override
        public void run() {
            num = 2;
            ready = true;
            System.out.println("write over");
        }
    }`
    
    hyl08发表于 2020/3/11 10:29:27
    • 执迷不悟

      我也没出现,我还试了多开点线程竞争,for循环多次,都没出现

      执迷不悟发表于 2020/3/20 12:53:27
    • 翟陆续

      @执迷不悟 指令重排序发生需要一定条件,书中例子只是为了说明指令重排序现象。

      翟陆续发表于 2020/7/4 11:35:38
  • jamesfuxk

    第10章的3.1 的第二个例子的结果输出有误。

    jamesfuxk发表于 2020/1/5 2:18:43
  • issxjl2015

    是否会公布书中源码?如果没有的话,打算自己敲一遍

    issxjl2015发表于 2019/11/3 20:17:57
  • 1
  • 2
  • 3
  • 4
  • 5