IcyFenix
IcyFenix
感谢指正。已更新至勘误。
感谢指正,已更新至勘误。
感谢,已更新至勘误
确实在一本书中术语应该统一,P268还有2处相同的问题。感谢指正,已更新至勘误。
在单路单核处理器上,多线程**并发**是指处理器分时复用,并不会出现一个线程观察另外一个线程的情形的,因为同时只存在一个活跃线程。重排序的影响必须在两个线程**并行**执行的时候才能观察到,而并行只在[Symmetrical Multi-Processing](https://en.wikipedia.org/wiki/Symmetric_multiprocessing)系统上才有讨论的意义。只不过现在已经很难见到单核系统了,所以并发与并行的概念渐渐混淆。 指令重排序与处理器数量多少没关系,在硬件层面的重排序优化是指将多条指令不按程序规定的顺序分开发送给各个相应的电路单元进行处理,这是因为处理器中不同的ISA指令是由不同的电路来实现的,譬如控制指令在[CU](https://en.wikipedia.org/wiki/Control_unit)中执行,算术指令在[APU](https://en.wikipedia.org/wiki/Arithmetic_logic_unit)中执行,浮点指令在[FPU](https://en.wikipedia.org/wiki/Floating-point_unit)中执行,甚至加法指令和乘法指令也会在ALU中不同电路里完成。这种设计决定了一个处理器,不按串行顺序“同时”执行多条指令,才能将尽可能多的电路用起来,提升整体效能。但是乱序也是有前提的,必须严格保证乱序的效果与顺序执行一致,注意是效果而不仅仅是结果,效果就包括了每条指令所产生的能被观察到的副作用,譬如对缓存的影响等等,乱序执行都必须与顺序执行一样,这点保证了单线程内无法观察到重排序的影响。
这个例子与书代码清单12-4实质上是一样的。根据JMM的规定,没有volatile的约束确实在理论上允许你所说的这种情况的发生。 建议不妨搜索一下DCL的Java语言实现,那里加volatile与你距这个例子中加volatile的意义也是一样的。
严谨起见,这段话修正为“【并】使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中”。
感谢指正,已更新至勘误。
你好。由于主贴的表述确实有点拗口,我不能确认是否准确理解了你所说的意思。 请先看下这段文字的原始材料来源,12.3小节开篇的脚注中有提到,它来自于JVMS6的“[Threads and Locks](https://docs.oracle.com/javase/specs/jvms/se6/html/Threads.doc.html)”一节,这里给出较旧的版本是因为JMM相关的内容在JVMS7之后就移出去,以独立JSR形式存在了,但内容并未变化。 > Rules for volatile Variables > If a variable is declared volatile, then additional constraints apply to the operations of each thread. Let T be a...
感谢指正,已更新至勘误。