java 内存模型

1, 并发编程两个关键要素:线程之间通信模式有两种,1,是共享内存,2 是消息通信,共享内存就是共享同一个变量

volatile 的内存语义是:当写入一个volatile 的变量时jmm 会把对应的值刷新到主内存中,然后通知其他线程重新读取这个值,具体实现原理是,在写入valotile 变量时会IO总线会增加一行lock#的指令,同行缓存一致性协议导致其他缓存读取的是失效的值,

 使用场景:1,对变量的写操作不依赖于当前值。不用作符合操作,volatile 只能保证内存的可见性,不能保证同步性, 例如i++,

2.  该变量没有包含在具有其他变量的不变式中。例如两个变量 a,b 是volatile 类型的,如果含有a>b 的表达式中,就必须使用同步,可能线程A 设置a=1 ,但是线程B 设置b=2 ,但是他们不是同一时刻,虽然保证了可见性,但是他们的值读取的并不是正确的

3.final变量写的重排序规则

1.jmm 禁止编译器将final 域的写重排序到构造方法之外

2,编译器会在final 域写入之后构造方法return 之前加一个内存屏障storestore ,这个内存屏障就是禁止处理器重排序到构造方法之外

4.final 变量读的重排序

线程初次读该对象的引用和初次读该对象包含的final 域,jmm 禁止处理器重排序这两个操作,编译器会在final 操作前加入一个loadload 内存屏障,如果初次读该对象的引用和初次读该对象包含的final 域这两个操作有依赖关系的话,处理器也不会重排序这两个操作

as-if-serial 语义保证单线程内程序执行结果不会改变,happens-before 语义保证在使用正确的锁或者同步的情况下,多线程程序执行的结果不会改变

happens-before 规则

程序顺序规则:一个线程中每一步的操作happens-before 该线程后续操作

监视器规则:一个锁的解锁happens-before 随后这个锁的加锁

volitile 规则:对于一个volitile域的写,happens-before 任意后续对该变量的读

传递性:A->B ,B->C ,那么A->C

 

猜你喜欢

转载自lliang54.iteye.com/blog/2386712