@翟陆续,您好!关于本书的2.4章节关于内存可见性问题的分析,有个疑惑请教下:线程B在修改X的值为2后将新值存放到线程2所在的一级Cache和共享二级Cache,线程B在刷一级Cache的时候,线程A的一级Cache不会失效么,根据缓存一致性协议MESI?线程A和线程B读X的时候,应该是同一个缓存行吧。麻烦大神抽空给予回复,谢谢!
你好,根据作者描述,线程A、B分别在不同的cpu上执行,1级cache属于各CPU私有,所以缓存不同
书中66页底部讲到 volatile关键字可以保证内存可见性和避免重排序那么假设如下变量顺序
abvolatile cde
是c前后都不会重排序了吗?还是{a, b可以随便动,c不动, d, e可以随便动}恳请作者给出解释,感谢!
volatile具有下面happen-before语义,来避免指令重排序: 当修改一个volatile变量时候,可以保证其前面对其他变量的读写操作,不会被重排序到写volatile变量操作后面。 读取一个volatile变量时候,可以保证其后面对其他变量的读写操作,不会被重排序到读volatile变量前面
书中第二章 讲指令重排的代码 为什么自己运行多次后的结果没有出现为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"); } }`
我也没出现,我还试了多开点线程竞争,for循环多次,都没出现
@执迷不悟 指令重排序发生需要一定条件,书中例子只是为了说明指令重排序现象。
第10章的3.1 的第二个例子的结果输出有误。
是否会公布书中源码?如果没有的话,打算自己敲一遍
@翟陆续,您好!关于本书的2.4章节关于内存可见性问题的分析,有个疑惑请教下:线程B在修改X的值为2后将新值存放到线程2所在的一级Cache和共享二级Cache,线程B在刷一级Cache的时候,线程A的一级Cache不会失效么,根据缓存一致性协议MESI?线程A和线程B读X的时候,应该是同一个缓存行吧。麻烦大神抽空给予回复,谢谢!
书中66页底部讲到 volatile关键字可以保证内存可见性和避免重排序
那么假设如下变量顺序
a
b
volatile c
d
e
是c前后都不会重排序了吗?还是{a, b可以随便动,c不动, d, e可以随便动}
恳请作者给出解释,感谢!
书中第二章 讲指令重排的代码 为什么自己运行多次后的结果没有出现为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();
}
第10章的3.1 的第二个例子的结果输出有误。
是否会公布书中源码?如果没有的话,打算自己敲一遍