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

Java中的Volatile到底是什么?

来源: 责编: 时间:2023-10-13 14:37:48 180观看
导读图片volatile是什么?"volatile"是一个关键字,用于修饰变量。它的作用是告诉编译器该变量可能会在意料之外的时候被修改,因此编译器在对该变量进行优化时需要特别小心。具体来说,当一个变量被声明为"volatile"时,编译器会禁

图片图片KHt28资讯网——每日最新资讯28at.com

volatile是什么?

"volatile"是一个关键字,用于修饰变量。它的作用是告诉编译器该变量可能会在意料之外的时候被修改,因此编译器在对该变量进行优化时需要特别小心。KHt28资讯网——每日最新资讯28at.com

具体来说,当一个变量被声明为"volatile"时,编译器会禁止对该变量进行某些优化,以确保每次访问该变量时都会从内存中读取最新的值,而不是使用之前缓存的值。这对于多线程编程或者与硬件交互的程序非常重要,因为在这些情况下,变量的值可能会被其他线程或者硬件设备修改。KHt28资讯网——每日最新资讯28at.com

需要注意的是,"volatile"关键字只能保证变量的可见性,不能保证原子性。如果需要保证原子性,还需要使用其他的同步机制,比如互斥锁或原子操作。KHt28资讯网——每日最新资讯28at.com

总结起来,"volatile"关键字用于修饰变量,告诉编译器该变量可能会在意料之外的时候被修改,从而禁止对该变量进行某些优化,确保每次访问变量时都会从内存中读取最新的值。KHt28资讯网——每日最新资讯28at.com

在Java中,关键字volatile用于修饰变量,用来确保多个线程之间对该变量的可见性和顺序性。KHt28资讯网——每日最新资讯28at.com

当一个变量被声明为volatile时,它的值将会被存储在主内存中,而不是线程的本地内存中。这样,当一个线程修改了该变量的值时,其他线程可以立即看到最新的值,而不是使用本地缓存中的旧值。KHt28资讯网——每日最新资讯28at.com

此外,volatile关键字还可以防止指令重排序,即保证了对该变量的操作按照代码的顺序执行,不会发生乱序执行的情况。KHt28资讯网——每日最新资讯28at.com

需要注意的是,volatile关键字只能保证可见性和顺序性,并不能保证原子性。如果需要保证原子性,可以考虑使用synchronized关键字或java.util.concurrent.atomic包中的原子类。KHt28资讯网——每日最新资讯28at.com

volatile作用

在Java中,volatile的作用是确保多个线程之间对该变量的可见性和有序性。具体来说,volatile的作用有以下几点:KHt28资讯网——每日最新资讯28at.com

  1. 可见性:当一个线程修改了volatile修饰的变量的值时,其他线程能够立即看到最新的值。这是因为volatile修饰的变量会被存储在主内存中,而不是线程的本地缓存中,从而保证了可见性。
  2. 有序性:volatile修饰的变量的读写操作具有顺序性。也就是说,当一个线程对volatile变量进行写操作后,其他线程在读取该变量时,会按照写操作的顺序来读取,不会出现乱序的情况。

volatile关键字在多线程编程中起到了重要的作用,可以用来确保变量的可见性和有序性,从而避免了由于线程间的竞争而引发的一些问题。KHt28资讯网——每日最新资讯28at.com

原子性

原子性是指一个操作要么完全执行,要么完全不执行,不会出现部分执行的情况。原子性是并发编程中的一个重要概念,用于确保多个线程或进程之间的操作不会相互干扰。KHt28资讯网——每日最新资讯28at.com

在并发编程中,多个线程或进程可能同时访问共享资源,如果没有保证原子性,就可能导致数据不一致或竞态条件等问题。为了保证原子性,可以使用锁、互斥量、原子操作等机制来控制对共享资源的访问。KHt28资讯网——每日最新资讯28at.com

在数据库中,原子性也是一个重要的概念。原子性要求数据库的操作要么全部执行成功,要么全部不执行,不会出现部分执行的情况。数据库中的事务就是为了保证原子性而设计的,事务可以将一组操作作为一个不可分割的单元进行执行,要么全部执行成功,要么全部回滚。KHt28资讯网——每日最新资讯28at.com

可见性

在计算机科学中,可见性通常指的是在多线程或并发编程中,一个线程对于其他线程的操作是否可见。可见性问题是由于多线程的执行顺序不确定性而引起的,当一个线程对共享变量进行修改后,其他线程可能无法立即看到这个修改,导致数据不一致或错误的结果。KHt28资讯网——每日最新资讯28at.com

有序性

为了提高程序的执行效率,编译器对编译后的指令进行重排序,即代码的编写顺序不一定就是代码的执行顺序。KHt28资讯网——每日最新资讯28at.com

并发编程只有同时满足这三大特性,才能保证程序正确的执行,而volatile只保证了可见性和有序性,不保证原子性。KHt28资讯网——每日最新资讯28at.com

volatile的作用只有两个

  • 保存内存的可见性
  • 禁止JVM内存重排序(保证有序性)

在并发多线程情况下,为什么会有可见性问题?如果不做控制,为什么一个线程修改了共享变量的值,其他线程不能立即看到。这里就需要了解JMM(JAVA内存模型,JAVA memory model)KHt28资讯网——每日最新资讯28at.com

由于JAVA共享变量是存储在主内存中,而JAVA线程是无法直接访问主内存数据,只能把主内存的数据拷贝一份副本,修改完本地内存的数据,再写回主内存,而此时另一个线程也把主内存的数据拷贝到自己私有的本地内存中,虽然线程1已经修改了主内存数据,但线程2却无法感知到,所以就出现了内存可见性问题。KHt28资讯网——每日最新资讯28at.com

可见性实现原理

当一个共享变量声明为volatile后,会有以下效果:KHt28资讯网——每日最新资讯28at.com

  • 当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去。
  • 这个写回操作会导致其他线程的缓存无效。

(volatile主要通过汇编lock前缀指令,它会锁定当前内存区域的缓存行,并且立即将当前缓存行数据写入到主内存中耗时非常短),回写主内存的时候会通过MESI协议使其他线程缓存了该变量的地址失效,从而导致其他线程需要去主内存中重新读取数据到工作线程中。)KHt28资讯网——每日最新资讯28at.com

有序性保证的原理:它是通过插入内存屏障,在内存屏障前后禁止重排序优化,以此实现有序性。KHt28资讯网——每日最新资讯28at.com

volatile应用场景

它可以保证可见性和有序性,但无法保证原子性,所以它的应用场景不如synchronized广泛,主要有两个场景:一个是做状态变量,二是做需要重新赋值的共享对象。KHt28资讯网——每日最新资讯28at.com

vloatile与synchronized的区别

volatile只能修饰变量,而后者可以修饰方法,语句块。volatile不能保证原子性,而后者是可以保证原子性的。都可以保证可见性,但原理不同,volatile是对变量加了Lock,而后者使用monitorEnter和monitorExit。volatile不会引起阻塞,而后者会。在一些场景下使用volatile性能是要更好地。KHt28资讯网——每日最新资讯28at.com

volatile使用条件

对变量的写操作不依赖当前值:比如i++操作,变量的写操作依赖安全值,所以不能保证线程安全。该变量没有包含在具有其他变量的不变式中。比如i<value,即使i变量声明为volatile,也不能保证线程安全,因为value可能在运行时候的判断发生变化。KHt28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-13581-0.htmlJava中的Volatile到底是什么?

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

上一篇: 深入探索Elasticsearch:高级查询技巧与性能优化策略

下一篇: 面试中如何答好:ReentrantLock

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top
Baidu
map