十分钟深入理解volatile

个人觉得JUC里面的东西比JVM还要玄,JUC中将引领我们用一种多线程的角度思考整体的程序,可以说是一种挑战吧。

volatile,中文语义:不稳定的

大家都应该了解这个常识吧!(不知道的一定要记好)

Java中,若一个变量会被多个线程所使用,我们需要给这个变量加上volatile关键字。

しかし!(但是)作为未来大厂高级电脑的附属品,我们必然不能只了解这个规则,更应该洞悉why,才能在未来的使用中,稳定起飞

index

一、首先,volatile到底是个啥?

Java语言规范第3版中对volatile的定义如下:

Java编程语言允许线程访问共享变量,为了 确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。

Java语言 提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存 模型确保所有线程看到这个变量的值是一致的

简单来讲:

volatile做到了两点:(下面这两句出自大佬的总结,学完以后感觉确实是这两句)

  1. 保证目标在Java内存空间的可见性(这句话先记起来,后面会细锁)
  2. 禁止指令重排

看下面的demo,若我们去掉volatile关键字,则consumer永远都不能执行完成,若我们加上了volatile,则执行成功了。

各位不要在循环等待中使用print方法,print方法是一个加锁的方法,该操作会刷新缓存,
https://blog.csdn.net/weixin_44494373/article/details/111767803

public class VolatileTest {
   

    //线程池,用来执行任务
    ExecutorService executorService ;
    int a;
    volatile boolean flag=false;

    public VolatileTest() {
   
        executorService = new ThreadPoolExecutor(3, 3,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值