汇编指令Java关键字volatile详解(深入浅出)

本文深入解析Java中的volatile关键字,探讨其在内存可见性、防止重排序方面的特性,以及实现原理。通过实例解释volatile如何保证线程间的数据同步,同时介绍其在单例模式中的应用,帮助理解其在并发编程中的重要性。
摘要由CSDN通过智能技术生成

作者:CoderW

volatile是什么

volatile是Java的一个关键字。

它提供的一种轻量级同步机制,能够保证可见性和有序性,但是不能保证原子性

可见性

对于volatile的可见性,先看看这段代码的执行

  • flag默认为true
  • 创建一个线程A去判断flag是否为true,如果为true循环执行i++操作
  • 两秒后,创建另一个线程B将flag修改为false
  • 线程A没有感知到flag已经被修改成false了,不能跳出循环

这相当于啥呢?

相当于你的女神和你说,你好好努力,年薪百万了就嫁给你,你听了之后,努力赚钱。3年之后,你年薪百万了,回去找你女神,结果发现你女神结婚了,她结婚的消息根本没有告诉你!难不难受?

女神结婚可以不告诉你,可是Java代码中的属性都是存在内存中,一个线程的修改为什么另一个线程为什么不可见呢?

这就不得不提到Java中的内存模型了,Java中的内存模型,简称JMM,JMM定义了线程和主内存之间的抽象关系,定义了线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

注意!JMM是一个屏蔽了不同操作系统架构的差异的抽象概念,只是一组Java规范。

了解了JMM,现在我们再回顾一下文章开头的那段代码,为什么线程B修改了flag线程A看到的还是原来的值呢?

  • 因为线程A复制了一份刚开始的flage=true到本地内存,之后线程A使用的flag都是这个复制到本地内存的flag。
  • 线程B修改了flag之后,将flag的值刷新到主内存,此时主内存的f
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值