前几节你应该学习到了Thread和ThreadLocal的底层原理,在接下来的几节中,让我们一起来探索volatile底层原理吧!
不知道你有没有这样的感受:有很多工程师都很难说清楚volatile这个关键字的作用或者原理。比如有的人压根不知道volatile的作用、应用场景;比如有的人也不知道什么是有序性,可见性,原子性,比如有的人可能能说上来它的作用是什么“保证有序性,可见性,无法保证原子性。”但是大多数人很难说清楚为什么能保证有序性,可见性,不能保证原子性;比如在面试的时候,你经常被面试官问到volatile的时候,回答的支支吾吾的,没有一个清晰的思路,答不出一个满意的答案。诸如此类的场景有很多等等……
要想弄明白这些,可不是简单的事情。所以在接下来的《JDK源码成长记-并发篇》中,就一步一步带领你来探索volatile的奥秘,来解决这些尴尬的场景,可以熟练运用和理解volatile关键字。
Hello Volatile
Hello Volatile
首先你要了解的第一点就是,什么时候使用volatile。这里你要记住以下两点就可以了:
1、 多个线程对同一个变量有读有写的时候
2、 多个线程需要保证有序性和可见性的时候
让我们分别来看看这两点:
volatile第一个使用场景:多个线程对同一个变量有读有写的时候。你可以通过一个Hello Volatile的例子来理解这一点。
代码如下:
public class HelloVolatile {
//可见性举例
private static volatile boolean shouldRunning = true;
//一个线程修改后,另一个线程无法读到修改后的值,线程之间的内存数据不可见
// private static boolean shouldRunning = true;
public static void main(String[] args) {
new Thread(()-> {
System.out.println("读取到变量shouldRunning="+HelloVolatile.shouldRunning);
while(HelloVolatile.shouldRunning) {
}
System.out.println("运行结束,读取到变量shouldRunning="+HelloVolatile.shouldRunning);
}).start();
new Thread(()-> {
try {