6.1 被volatile修饰的变量有两大特点
● 特点:○ 可见性○ 有序性:有排序要求,有时需要禁重排● 内存语义:○ 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中○ 当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,重新回到主内存中读取最新共享变量的值○ 所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取● volatile凭什么可以保证可见性和有序性?○ 内存屏障Memory Barrier
6.2 内存屏障(面试重点必须拿下)
再说vilatile两大特性:○ 可见:写完后立即刷新回主内存并及时发出通知,大家可以去主内存拿最新版,前面的修改对后面所有线程可见○ 有序性(禁重排):重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,有时候会改变程序语句的先后顺序,若不存在数据依赖关系,可以重排序;存在数据依赖关系,禁止重排序;但重排后的指令绝对不能改变原有的串行语义!这点在并发设计中必须要重点考虑!
6.2.3 内存屏障分类
粗分两种:
● 读屏障(Load Barrier):在读指令之前插入读屏障,让工作内存或CPU高速缓存 当中的缓存数据失效,重新回到主内存中获取最新数据。
● 写屏障(Store Barrier):在写指令之后插入写屏障,强制把缓冲区的数据刷回到主内存中。
细分四种: