【Java并发编程系列2】volatile

主要讲解volatile的相关知识,以及容易遇到的坑。
volatile变量的特性
保证可见性,不保证原子性:
- 当写一个volatile变量时,JMM会把该线程本地内存中的变量强制刷新到主内存中去;
- 这个写会操作会导致其他线程中的volatile变量缓存无效。
禁止指令重排,我们回顾一下,重排序需要遵守一定规则:
- 重排序操作不会对存在数据依赖关系的操作进行重排序。比如:a=1;b=a; 这个指令序列,由于第二个操作依赖于第一个操作,所以在编译时和处理器运行时这两个操作不会被重排序。
- 重排序是为了优化性能,但是不管怎么重排序,单线程下程序的执行结果不能被改变。 比如:a=1;b=2;c=a+b这三个操作,第一步(a=1)和第二步(b=2)由于不存在数据依赖关系, 所以可能会发生重排序,但是c=a+b这个操作是不会被重排序的,因为需要保证最终的结果一定是c=a+b=3。
volatile禁止指令重排规则
使用volatile关键字修饰共享变量便可以禁止这种重排序。若用volatile修饰共享变量,在编译时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序,vo...
热门评论
7 条评论
回复