volatile关键字在并发中有哪些作用?

本文探讨了Java中volatile关键字的作用,它确保了变量的可见性和有序性,但不保证原子性。volatile通过禁止指令重排序来保持有序性,并利用内存屏障确保变量更新的可见性。然而,对于复合操作如i++,volatile无法保证原子性,解决方案包括synchronized、Lock或使用Atomic类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

读过笔者之前的一篇文章https://mp.weixin.qq.com/s/iyXN4WyGAV_J4d8zeiG7yA, 我们知道了由于计算机为了充分利用CPU的高性能,以及各个硬件 存取速度巨大的差异带来的一系列问题

  1. 为了充分压榨CPU的性能,CPU 会对指令乱序执行或者语言的编译器会指令重排,让CPU一直工作不停歇,但同时会导致有序性问题。
  2. 为了平衡CPU的寄存器和内存的速度差异,计算机的CPU 增加了高速缓存,但同时导致了 可见性问题
  3. 为了平衡CPU 与 I/O 设备的速度差异,操作系统增加了进程、线程概念,以分时复用 CPU,但同时导致了原子性问题。

Java 是最早尝试提供内存模型的编程语言。由于Java 语言是跨平台的,另外各个操作系统总存在一些差异,Java在物理机器的基础上抽象出一个 内存模型(JMM),来简化和管理并发程序。我们都知道Java并发的三大特性:原子性,可见性,有序性

  • 原子性指的是一个不可以被分割的操作,即这个操作在执行过程中不能被中断,要么全部不执行,要么全部执行。且一旦开始执行,不会被其他线程打断。
  • 可见性 指的是一个线程修改了共享变量后,其他线程能立即感知这个变量被修改。
  • 有序性 指程序按照代码的先后顺序执行。 在Java内存模型中,为了提升效率是允许编译器和处理器对指令进行重排序,当然重排序不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小牛呼噜噜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值