作者回复: 厉害厉害!!!
作者回复: 这三种方式都正确,理解的不错!
作者回复: 感谢回复!
作者回复: 这个我称为炫技!
作者回复: 很全面了!
作者回复: 你分析的比我还要好!
作者回复: 终于理解了!
作者回复: 可以重排,但是要保证符合Happens-Before规则,Happens-Before规则关注的是可见性,
x=5;
y=6;
z=x+y;
上面的代码重排成这样:
y=6;
x=5;
z=x+y;
也是可以的。
所谓顺序,指的是你可以用顺序的方式推演程序的执行,但是程序的执行不一定是完全顺序的。编译器保证结果一定 == 顺序方式推演的结果
这几条规则,都是告诉你,可以按照这个规则推演程序的执行。但是编译怎么优化,那就百花齐放了。
作者回复: 有可能通过global.obj 可能访问到还没有初始化的this对象
将this赋值给global.obj时,this还没有初始化完,this还没有初始化完,this还没有初始化完。
作者回复: “x=42” Happens-Before 写变量 “v=true”
是因为程序顺序就是这么写的:x=42;v=true
这个案例是综合了 程序的顺序规则+传递规则+volatile 规则
这三这个规则组合在一起就是你所谓的:“而是有 volatile 决定的”。编译器优化要遵循所有的HB规则。所有,不是一条。所以只有把他们组合在一起才有意义。
作者回复: 你的理解是对的,volatile的实现就是这样的。指导JVM这么实现的规范就是内存模型。这个专栏的侧重点是让大家学会写并发程序,至于底层是怎么实现的,有精力和兴趣的同学,可以自己来把握。
作者回复: 咱们这个专栏还是专注于并发相关的部分,我怕有人说挂羊头卖狗肉
作者回复: 是这样。
作者回复: 多谢鼓励啊!
作者回复: 不加volatile,多线程会有问题
作者回复: 那小说得写的有多烂!