Java volatile 怎么保证不被指令重排序优化
2018-02-04 13:46
281 查看
内存间交互操作
lock: 作用主内存unlock: 作用主内存
read/load:这两个操作顺序执行,不能单独出现;主内存的变量=>工作内存的变量
use: 作用工作内存,把工作内存变量传给执行引擎
assign: 作用工作内存,把执行引擎收到的值赋给工作内存变量
store/write: 这两个操作顺序执行;不能单独出现;工作内存的变量=>主内存的变量
通过主内存与工作内存交互来理解这些操作:
注意:不允许
工作内存直接使用未初始化的变量
内存模型的3个特征
原子性有序性, 同一个线程内观察是有序, 一个线程观察另一个线程的操作是无序的
可见性
重排序
如下代码,由于threadA对于threadB是无序的,对A重排序优化,②可能提前执行,这就导致threadB跳过④ThreadA { do something //① set flag = true//② } ThreadB { if(flag){ //③ do something //④ } }通过volatile,synchronized可以禁止重排序优化
happens-before(hb)
意义:内存模型通过hb原则并发操作过程中的有序性问题actionA先行发生actionB,就是说A对B可见(A的结果在B执行时可见)线程启动/终结规则volatile规则, volatile变量写操作hb后面读操作
lock规则, unlock hb lock
Order规则, 线程内书写前面的操作hb书写后面的操作
中断规则, Thread.interrupt hb 被中断程序检测到的中断事件的发生
传递性
volatile禁止重排序原理
如下图,1、2保证可见性,3禁止重排序1.A动作之前必关联P、F动作2.B动作自后必然伴随G、Q动作
3.A优先于B,则P优先于Q(这个比较显然);B优先于A,则Q优先于P
例如:线程B对变量flag=true同步优先于A线程使用
volatile深入理解Demo
相关文章推荐
- volatile关键字作用与内存可见性、指令重排序概述[JAVA]
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
- Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)
- Java的多线程机制系列:不得不提的volatile及指令重排序
- volatile关键字作用与内存可见性、指令重排序概述[JAVA]
- 深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
- java新手如何简单的理解java数组中冒泡排序法是怎么实现排序的
- Java并发:volatile内存可见性和指令重排
- Java 内存模型(三)-从源代码到指令序列的重排序
- java快速排序,优化
- Java并发:volatile内存可见性和指令重排
- 深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
- 怎么优化JAVA程序的执行效率和性能?
- 不得不提的volatile及指令重排序(happen-before)
- java多线程和并发编程(三)--- 从JVM并发看CPU内存指令重排序(Memory Reordering)
- JAVAWEB开发之Lucene详解——Lucene入门及使用场景、全文检索、索引CRUD、优化索引库、分词器、高亮、相关度排序、各种查询
- 深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
- java使用volatile以及双重检查加锁优化单例在多线程下的性能
- JAVA 基础系列之 重排序和Volatile