JDK成长记13:(深度好文)你能从3个层面分析volatile底层原理么?(上)

file

前几节你应该学习到了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 {
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值