java并发编程的艺术【三】-【三】内存语义

Volatile的内存语义

Volatile的内存语义
可见性:对于一个volatile变量的读,总能看见任意线程对volatile变量最后的写。
原子性:对于任意单个volatile变量的读写具有原子性,但对于符合操作不具有原子性。

当写volatile变量时,jvm会把线程中对用的本地存贮刷新到内存。
读取volatile变量时,jvm会把本地存贮的值置为无效,读取内存中的值。

Volatile内存语义的实现
StoreStore屏障 volatile写操作 StoreLoad屏障
Volatile写操作 LoadLoad屏障 LoadStore屏障

锁的内存语义

锁的内存语义
释放锁的时候,jvm把线程本地存贮刷新到内存中。
获取锁的时候,jvm会把线程对应的本地内存置为无效,而迫使被监视器保护的临界区代码必须从主内存中读取共享变量。

锁内存语义的实现
1>利用volatile变量的读写内存语义
2>利用cas所附带的volatile读和volatile写的内存语义。

ps:cas同时具有volatile读-写的内存语义。

Final域的内存语义

对于final域,编译器和处理器要遵守两个重排序规则。
1,对于构造函数对final域的写入,在随后这个被构造的对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2,初次读取一个包含final域的对象的引用,于随后初次读取这个final域,这两个操作之间不能重排序。

猜你喜欢

转载自blog.csdn.net/wangpengzhi19891223/article/details/78645033