《Java并发编程实战》的笔记-volatile 变量

红色有角F叔
红色有角F叔 (次元の呪い)

读过 Java并发编程实战

  • 章节名:volatile 变量
  • 2014-05-07 09:42:03
56人阅读

2014-05-07 09:50:18 2sin18°

感觉这些并发原语解释起来都很晦涩,但如果映射到其对应的汇编其实没那么复杂

2014-05-07 09:55:04 红色有角F叔

感觉汇编乃至C缺少一个内存模型,这些东西反而更难讲唉,哪个指令会插栅栏,哪个指令会锁总线什么的,语义还是在汇编之下的

2014-05-07 10:00:47 2sin18°

如果是单核应该都类似,如果是多核应该就是两种内存一致性模型吧?到硬件级别还有一个好处,理解cuda/opencl的内存模型也更容易。。。(可能记错了

2014-05-07 10:10:22 红色有角F叔

不同体系结构在顺序约束上的差异还挺大的 http://www.douban.com/photos/photo/2011251690/

不过对于特定的一个体系结构而言,啃啃手册都可以找到,怎么用好就是另一回事了


2014-05-07 10:39:24 BohuTANG

在C里是可以用汇编保证:
#LoadLoad
#LoadStore
#StoreStore
三种barrier的
只有#StoreLoad是保证不了,所以高级语言在内存模型上根据不同的CPU架构处理下这个就可以了


2014-05-07 10:50:27 BohuTANG

个人理解,在java/c#里,volatile语义的作用就是以上4中fence都保证(跟C的volatile不是一回事)
http://gee.cs.oswego.edu/dl/jmm/cookbook.html


2014-05-07 11:00:37 2sin18°

学习了

2014-05-07 11:02:52 红色有角F叔

感觉 C 的 volatile 的语义只是从寄存器写透变量到内存而已,java 有内存模型之后 volatile 的语义会丰富很多,但依然不建议使用

2014-05-07 11:03:16 红色有角F叔

@BohuTang 看了下 cookbook,好像说 LoadLoad, LoadStore, StoreStore 是在某一些体系结构下可选,而 StoreLoad 是在所有体系结构下都要做?

2014-05-07 11:26:24 BohuTANG

@小透明のF叔
前三种是编译器的reorder,而StoreLoad是CPU级别的,包括store buffer, request queue的flush,还有CPU的reorder.
不同的CPU提供的指令应该不一样...


2014-05-07 11:38:12 红色有角F叔

说起编译器,“感觉 C 的 volatile 的语义只是从寄存器写透变量到内存而已” 这句说错了,volatile 好像也有抑制编译器 Reorder 的语义 _(:з」∠) _

记得刷 store buffer 是读栅栏,对应的是 Load Load 吧 Q.Q... 刷 invalidate queue 是写栅栏,两个都刷是读写栅栏?


2014-05-07 11:51:19 BohuTANG

1) 那句话是错的

2) 剩下的参考 Acquire and Release Fences
http://preshing.com/20130922/acquire-and-release-fences/


2014-05-07 11:52:40 BohuTANG

LoadLoad跟store buffer没关系,只是个顺序,比如:
load x;
load y;

如果没用LoadLoad fence保证,可能:
load y;
load x;


2014-05-07 11:52:52 红色有角F叔

@Bohutang 多谢,马克了 ●ω●

2014-05-07 11:59:31 红色有角F叔

@bohutang 刚刚我弄反了,store buffer 影响到 Store Store 的顺序,Invalidate queue 影响到 load load 的顺序:

A store barrier, “sfence” instruction on x86, forces all store instructions prior to the barrier to happen before the barrier and have the store buffers flushed to cache for the CPU on which it is issued.

http://mechanical-sympathy.blogspot.sg/2011/07/memory-barriersfences.html


2014-05-11 23:21:09 BohuTANG

Martin里说的应该是一致性较弱的cpu模型,而且store queue影响到的是对同一个地址操作,其他cpu是否可见,这是coherence,而loadload是consistency

2014-05-11 23:45:12 红色有角F叔

感觉 Load/Load, Store/Store 等等应该也是指同一个地址的操作的,

以 Store/Load 为例:

Load A |
............ | Store A
Load A | <- 可能仍然是旧的

如果加上栅栏:

Load A |
............| Store A
---------| Store Load Barrier
Load A | <-- 可以得到新的 A


2014-05-12 15:27:51 BohuTANG

2014-05-12 16:36:19 红色有角F叔

好文章多谢,顺着摸到这篇文章也很赞的感觉 http://preshing.com/20120710/memory-barriers-are-like-source-control-operations/
回家好好学习一下 ●ω●


2014-05-12 17:59:54 BohuTANG

preshing的所有文章都值得看

> 红色有角F叔的所有笔记(612篇)

红色有角F叔对本书的所有笔记  · · · · · ·

  • 线程安全性

    在一些大型程序中,要找出多个线程在哪些位置上将访问同一个变量是非常复杂的。幸运的是,面向对...

  • 线程安全性

    当执行时间较长的计算或者可能无法快速完成的操作(例如网络IO或控制台IO)时,一定不要持有锁。

  • volatile 变量
  • 发布与逸出

    无论其她的线程会对已发布的引用执行何种操作,其实都不重要,因为误用该引用的风险始终存在。 ...

  • 线程封闭

    一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术称为...

说明  · · · · · ·

表示其中内容是对原文的摘抄