今天看 JLS 突然发现,实际的 implementation(实现) 的输出结果只是 specification(规范) 里面的输出结果的一个 subset(子集)。就是实际的实现,只是对于规范的一个视图,并不是完整的设计思路。所以太抠实际实现的源码的细节可能会导致我们对于整体思路的理解有误。
比如:
线程一执行
x = 1;
r1 = x;
线程 2 执行 x = 2
究竟会在什么情况下会被编译成:
线程1:
x = 1;
r1 = 1;
线程2:
x=2;
不同的虚拟机在不同的场景表现都不一样,但是只要结果(r1 究竟等于什么)是属于结果集的一个子集就可以,规范中说这个是不确定的,我们不必纠结,只是知道这里有并发安全问题知道要同步就可以。实际的实现,会很复杂,JIT 优化,内存优化涉及的会很多,究竟是否因为编译成 r1 = 1 导致其实 r1 只有一个结果不同操作系统不同环境不同JVM实现其实是不确定的。
展开
评论