Java并发【四】:一文讲透volatile底层原理

tech2022-08-24  108

讲透volatile底层原理

volatile支持原子性volatile支持可见性volatile支持有序性volatile常见使用场景volatile与锁的区别

在上文中说了,在并发编程中可能出现原子性、可见性和有序性的问题。JDK提供了volatile关键字解决这些问题。

volatile支持原子性

首先,先谈一下java语言里面的原子性,像int i =0 ;flag = true; 引用a = 引用b,这些变量的简单赋值操作都是原子的。

但是很多复杂的一些操作,i++,先读取i的值,再更新i的值,这种操作不是简单赋值写,它是有计算的过程在里面的,此时java语言默认规范不保证原子性的。

but,为什么这里谈到volatile解决原子性那?其实volatile对原子性保障的语义,在java里很有限的,几乎可以忽略不计。32位的java虚拟机里面,对long/double变量的赋值写不是原子的,但是加上了volatile,就可以保证在32位虚拟机里面,对long/double变量的赋值是原子性的。

volatile解决可见性和有序性问题都是通过内存屏障实现的。

volatile支持可见性

volatile支持有序性

volatile常见使用场景

volatile int count = 1; // 像这种可以当作java语言层面的信号量volatile boolean flag = false;// 像这种可以用作多线程之间的通信 具体的使用场景,像第一种在Lock锁里面有使用。

volatile与锁的区别

再有人问你volatile是什么,把这篇文章也发给他

内存模型是怎么解决缓存一致性问题的?

缓存一致性协议-MESI协议

从硬件缓存模型到Java内存模型原理浅析

最新回复(0)