Volatile相关知识点

本文介绍了Java中的volatile关键字,详细阐述了其内存定义、特点和使用场景。volatile保证了变量的可见性,防止指令重排,但不保证原子性。它适用于单线程写、多线程读的并发场景,常用于Atomic*系列类的实现。
摘要由CSDN通过智能技术生成

volatile内存定义

当写一个volatile变量时,JMM会将该线程写入到工作内存的值同步刷新到主内存中。
当读一个volatile变量时,JMM会将该线程工作内存中的值置为无效,直接从主内存中读取值并刷新到工作内存中。

特点

  • 只能用来修饰变量
  • 可以保证变量的可见性 ,也就是当这个变量修改后,所有线程都会被要求重新从主内存中再次拷贝一次该变量的值到工作空间中。主要是通过两个操作来保证共享变量的可见性:
    1、被volatile关键词修饰的变量,当CPU处理完该数据将数据刷回高速缓存区时,会立马将数据刷回内存。
    2、当被volatile关键词修饰的变量刷回内存时,立马让其他CPU中使用的该变量无效,在最开始时是采用在总线上添加LOCK#锁来做的,但该方式效率比较低,后续Intel将实现方式改为只要CPU在修改了被volatile修饰的共享变量后,就会向其他CPU发出信号,将读取到工作内存中的变量无效化,而其他CPU在需要使用这个变量时,如果检测到这个无效信号,就会重新从主内存中再次读取一次该变量的值,从而保证了可见性。
  • 同时该关键词还可以禁止指令重排,实现原理一个是在字节码层面添加了ACC_VOLATILE关键词保证,另一个是在JVM中通过插入内存屏障来保证,内存屏障就是保证前者执行完之后才执行后者,有点类似依赖关系,有LOADLOAD、LOADSTORE、STORELOAD、STORESTORE四种情况。
    LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2, 在L
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值