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

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

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

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

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

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

1. volatile关键字的原理

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

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

同样地,当一个线程修改了volatile变量的值时,这个变化将立即写回到主内存中,而不是仅仅保存在线程的本地缓存中。mNQ28资讯网——每日最新资讯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的变化,因此可以正确地退出循环,从而避免了可能出现的问题。mNQ28资讯网——每日最新资讯28at.com

实际应用

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

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

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

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

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

小结

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

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

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

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

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

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

标签:
  • 热门焦点
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的“今天”,百度也很迷茫。“新业务到 2022 年底还是 0,希望 2023 年出来一个 1。”这是2022年底,李彦宏
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top
Baidu
map