深入理解Java虚拟机,第二版,周志明著。
第五部分第十二章的 12.3.5,关于有序性的表达中这么说到:
有序性(Ordering):Java内存模型的有序性在前面讲解 volatile 时也详细地讨论过了, Java程序中天然的有序性可以总结为一句话:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行的语义”( Within-Thread As-If-Serial Semantics),后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。Java语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性, volatile 关键字本身就包含了禁止指令重排序的语义,而 synchronized 则是由“一个变量在同一个时刻只允许一条线程对其进行lock操作”这条规则得到有序性的,这条规则决定了持有同一个锁的两个同步块只能串行地进入。
“如果在一个线程中观察另一个线程,所有的操作都是无序的”该如何理解?
“后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。”这句话里的几个名词的意思我大致都知道,但不能理解“在一个线程中观察另一个”,怎么在一个线程中?什么叫观察?
谢谢
用户的指令都是在线程中执行的。指令执行在哪个线程里,就是“在”哪一个线程。
线程的运行通常没有办法直接观察到,一般只能观察到线程执行的后果,比如内存的改变。于是观察,多数情况下是指去读取被修改了内存的值。
在一个线程中执行的指令,去读取另一个线程修改的变量的值。
所谓无序,就是说读取线程中读取到的变量值发生改变的顺序,和修改线程中修改变量的顺序,不一定一致。