关于JVM一书中“如果在一个线程中观察另一个线程,所有的操作都是无序的”,能否举个例子?

深入理解Java虚拟机,第二版,周志明著。
第五部分第十二章的 12.3.5,关于有序性的表达中这么说到:

有序性(Ordering):Java内存模型的有序性在前面讲解 volatile 时也详细地讨论过了, Java程序中天然的有序性可以总结为一句话:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行的语义”( Within-Thread As-If-Serial Semantics),后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。

Java语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性, volatile 关键字本身就包含了禁止指令重排序的语义,而 synchronized 则是由“一个变量在同一个时刻只允许一条线程对其进行lock操作”这条规则得到有序性的,这条规则决定了持有同一个锁的两个同步块只能串行地进入。

“如果在一个线程中观察另一个线程,所有的操作都是无序的”该如何理解?
“后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象。”这句话里的几个名词的意思我大致都知道,但不能理解“在一个线程中观察另一个”,怎么在一个线程中?什么叫观察?

谢谢

阅读 3.5k
3 个回答
怎么在一个线程中?

用户的指令都是在线程中执行的。指令执行在哪个线程里,就是“在”哪一个线程。

什么叫观察?

线程的运行通常没有办法直接观察到,一般只能观察到线程执行的后果,比如内存的改变。于是观察,多数情况下是指去读取被修改了内存的值。

在一个线程中观察另一个

在一个线程中执行的指令,去读取另一个线程修改的变量的值。

所谓无序,就是说读取线程中读取到的变量值发生改变的顺序,和修改线程中修改变量的顺序,不一定一致。

观察就是一个线程会读取另一个线程修改的变量,就是变量的可见性问题...

我的理解就是 重排序 以及 工作内存 和 主内存之间的交互,导致一个线程在观察另一个线程的时候出现 很多不确定因素,所以称之为:无序。其实也就是指可见性。个人理解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题