当前位置:首页 > 科技  > 软件

一个熟悉又陌生的关键字:volatile

来源: 责编: 时间:2024-03-18 09:41:34 266观看
导读Hello,今天了不起带大家了解一下这个熟悉又陌生的关键字:volatile。在Java多线程编程中,保证线程安全性是至关重要的。而volatile关键字是实现线程安全性的一种关键机制。为什么熟悉又陌生呢?Java开发者几乎全都用到过这

Hello,今天了不起带大家了解一下这个熟悉又陌生的关键字:volatile。NzA28资讯网——每日最新资讯28at.com

在Java多线程编程中,保证线程安全性是至关重要的。而volatile关键字是实现线程安全性的一种关键机制。NzA28资讯网——每日最新资讯28at.com

为什么熟悉又陌生呢?Java开发者几乎全都用到过这个关键字,但是又不记得什么时候用了它。NzA28资讯网——每日最新资讯28at.com

1. volatile关键字的原理

volatile关键字主要用于保证变量在多线程环境下的可见性和禁止指令重排序。NzA28资讯网——每日最新资讯28at.com

当一个变量被volatile修饰时,线程在读取这个变量的值时将直接从主内存中读取,而不是从线程的本地缓存中读取。NzA28资讯网——每日最新资讯28at.com

同样地,当一个线程修改了volatile变量的值时,这个变化将立即写回到主内存中,而不是仅仅保存在线程的本地缓存中。NzA28资讯网——每日最新资讯28at.com

2. volatile关键字的作用

  • 保证可见性:在多线程环境下,如果一个线程修改了volatile变量的值,那么其他线程将立即看到这个变化。这样可以避免线程间的数据不一致性问题。
  • 禁止指令重排序:volatile关键字还可以防止编译器和处理器对代码的优化,确保指令按照程序的顺序执行,避免出现意料之外的行为。

3. volatile关键字的正确使用方法

  • 适用场景:volatile适用于那些被多个线程访问但并不涉及复合操作(例如递增操作)的变量。典型的使用场景包括状态标志、控制变量等。
  • 不适用场景:不要将volatile用于需要原子性操作的场景,因为volatile并不能保证原子性。对于需要原子性操作的场景,应该使用锁或者Atomic原子类。

4. 示例代码

public class VolatileExample {    private volatile boolean flag = false;    public void startTask() {        // 启动一个线程来修改flag的值        new Thread(() -> {            try {                Thread.sleep(1000); // 模拟耗时操作            } catch (InterruptedException e) {                e.printStackTrace();            }            flag = true;            System.out.println("Flag has been set to true.");        }).start();    }    public void monitorTask() {        // 启动一个线程来检查flag的值        new Thread(() -> {            while (!flag) {                // 循环等待,直到flag变为true            }            System.out.println("Flag is now true. Task can proceed.");        }).start();    }    public static void main(String[] args) {        VolatileExample example = new VolatileExample();        example.startTask();        example.monitorTask();    }}

在这个示例中,我们有两个线程,一个线程调用startTask()方法来修改flag的值为true,另一个线程调用monitorTask()方法来检查flag的值是否为true。在flag没有被volatile修饰的情况下,可能会出现monitorTask()方法陷入死循环的情况,因为它无法及时获取到flag的最新值。但是,由于flag被volatile修饰,线程可以立即看到flag的变化,因此可以正确地退出循环,从而避免了可能出现的问题。NzA28资讯网——每日最新资讯28at.com

实际应用

事实上,这个简单的示例代码,在实际使用中,几乎是用不到它这种写法;那到底是怎么使用的这个volatile呢?NzA28资讯网——每日最新资讯28at.com

其实在Java中,java.util.concurrent.atomic包提供了一组原子类,比如AtomicInteger、AtomicLong、AtomicBoolean等,它们提供了一种无锁的线程安全机制,以确保对变量的操作是原子性的。NzA28资讯网——每日最新资讯28at.com

当谈到Atomic原子类的实现原理时,CAS(Compare and Swap)操作是其中的关键。CAS是一种乐观锁技术,它涉及比较内存中的值和预期值,如果相等,则使用新值替换内存中的值。在Java中,CAS是通过Unsafe类实现的,它是一种硬件级别的原子性操作。NzA28资讯网——每日最新资讯28at.com

但是,CAS操作本身无法解决线程可见性的问题,这就是volatile关键字的作用。volatile关键字可以确保变量的写操作立即可见于其他线程,从而解决了线程之间的可见性问题。因此,Atomic原子类是结合了CAS和volatile关键字来实现线程安全。NzA28资讯网——每日最新资讯28at.com

因此,结合了CAS和volatile关键字,Atomic原子类能够在无锁的情况下实现线程安全,提供了一种高效的并发编程解决方案。CAS保证了原子性,volatile保证了可见性,两者结合起来提供了一个强大的多线程环境下的并发控制机制。NzA28资讯网——每日最新资讯28at.com

小结

日常开发中,我们一般情况下都是直接使用的Atomic原子类来保证线程安全的情况,并不会去直接使用volatile关键字,乍一看这个volatile还真是熟悉又陌生呢!NzA28资讯网——每日最新资讯28at.com

NzA28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-76521-0.html一个熟悉又陌生的关键字:volatile

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Bind、Call、Apply的区别?如何实现bind

下一篇: 快速入门Shelve:Python数据存储利器

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
Top