Java volatile 作用和使用场景

volatile的使用场景 参考:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html 总结 其实换个角度,非常简单能够理解和应用: 一个引用指明了一个内存的地址,地址上有引用反映出来的值。 比如:Integer i = 1 ; 引用 i 指向 一个地址 0x10101 地址 0x10101 上的值为 1 ; 为了线程安全,volatile能修... 阅读详情

volatile 是 Java 中的一个关键字,用于修饰变量。它是 Java 内存模型 (JMM) 中实现可见性和有序性(禁止指令重排序)的一种轻量级同步机制。
一、volatile 的作用

volatile 关键字有两个主要作用:

  1. 保证可见性 (Visibility):

    • 什么是可见性问题?

      • 在多线程环境下,每个线程都有自己的工作内存(例如 CPU 缓存)。
      • 线程对共享变量的修改,首先会在自己的工作内存中进行,然后才会被刷新到主内存中。
      • 其他线程可能无法立即看到这个修改,因为它们可能还在读取自己工作内存中的旧值。
      • 这就是可见性问题:一个线程对共享变量的修改,对其他线程不可见。
    • volatile 如何保证可见性?

      • 当一个变量被声明为 volatile 时,Java 内存模型 (JMM) 会确保:
        • 写操作: 当一个线程修改了 volatile 变量的值,这个新值会立即被刷新到主内存中。
        • 读操作: 当一个线程读取 volatile 变量的值,它会强制从主内存中读取最新值,而不是从自己的工作内存中读取。
    • 底层原理 (简化):

      • 写操作: 在写 volatile 变量时,会插入一个 StoreStore 屏障 和一个 StoreLoad 屏障。
        • StoreStore 屏障:禁止上面的普通写和下面的 volatile 写重排序。
        • StoreLoad 屏障:强制刷新处理器缓存,确保其他处理器能够看到 volatile 变量的最新值。
      • 读操作: 在读 volatile 变量时,会插入一个 LoadLoad 屏障 和一个 LoadStore 屏障。
        • LoadLoad 屏障:禁止上面的 volatile 读和下面的普通读重排序。
        • LoadStore 屏障:禁止上面的 volatile 读和下面的普通写重排序。
        • 还会强制从主内存读取 volatile 变量的值。
  2. 禁止指令重排序 (Ordering):

    • 什么是指令重排序?

      • 为了优化性能,编译器和处理器可能会对指令的执行顺序进行重新排序,只要不影响单线程程序的执行结果。
      • 但在多线程环境下,指令重排序可能会导致意想不到的问题。
    • volatile 如何禁止指令重排序?

      • volatile 关键字可以禁止特定类型的指令重排序,具体规则如下:
        • 写操作:
          • 不能将 volatile 写操作重排序到之前的任何操作之前。
          • 不能将 volatile 写操作重排序到之后的其他 volatile 写操作之后。
        • 读操作:
          • 不能将 volatile 读操作重排序到之后的任何操作之后。
          • 不能将 volatile 读操作重排序到之前的其他 volatile 读操作之前。
    • 内存屏障 (Memory Barrier):

      • volatile 的禁止指令重排序是通过 内存屏障 (Memory Barrier) 来实现的。
      • 内存屏障是一种特殊的 CPU 指令,可以强制处理器按照特定的顺序执行内存操作,并刷新处理器缓存。

二、volatile 的使用场景

volatile 适用于以下场景:

  1. 状态标志 (Status Flag):

    • 场景描述:

      • 使用一个 boolean 类型的变量作为状态标志,控制线程的执行。
      • 例如,一个线程检查标志位,决定是否继续执行;另一个线程修改标志位,通知其他线程停止执行。
    • volatile 的作用:

      • 保证标志位的可见性,确保线程能够及时看到标志位的变化。
    • 代码示例:

      public class VolatileFlagExample {
      
          private volatile boolean running = true; // 使用 volatile 修饰
      
          public void start() {
              new Thread(() -> {
                  while (running) {
                      // 执行任务
                      System.out.println("Running...");
                      try {
                          Thread.sleep(100);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                  System.out.println("Stopped.");
              }).start();
          }
      
          public void stop() {
              running = false; // 修改标志位
          }
      
          public static void main(String[] args) throws InterruptedException {
              VolatileFlagExample example = new VolatileFlagExample();
              example.start();
              Thread.sleep(2000);
              example.stop();
          }
      }
      
  2. 双重检查锁定 (Double-Checked Locking) 单例模式 (JDK 1.5 之后):

    • 场景描述:

      • 单例模式的一种实现方式,延迟初始化,只有在第一次使用时才创建实例。
      • 为了保证线程安全,需要进行同步处理。
      • 双重检查锁定是一种优化手段,可以减少同步的开销。
    • volatile 的作用:

      • 禁止指令重排序,确保 instance = new Singleton() 这条语句的原子性.
        这条语句并非原子操作,实际上包含三个步骤:
      1. 分配内存空间
      2. 初始化对象
      3. 将 instance 指向分配的内存空间。
        如果没有 volatile,可能会发生指令重排序,导致一个线程获取到未完全初始化的对象。
    • JDK1.5 之前,即使是使用了双重检查,由于volatile 关键字语义不完善, DCL仍然不能保证安全。

    • 代码示例:

      public class Singleton {
      
          private volatile static Singleton instance; // 使用 volatile 修饰
      
          private Singleton() {}
      
          public static Singleton getInstance() {
              if (instance == null) { // 第一次检查
                  synchronized (Singleton.class) { // 加锁
                      if (instance == null) { // 第二次检查
                          instance = new Singleton();
                      }
                  }
              }
              return instance;
          }
      }
      
  3. 发布-订阅模式中的可见性:

    • 场景描述:

      • 一个线程发布(修改)一个共享变量,其他线程订阅(读取)这个变量的变化。
    • volatile 的作用:

      • 保证发布线程对共享变量的修改对订阅线程可见。
  4. 写多读少的场景:

    • 如果一个变量被多个线程读取, 但只有一个线程写入,使用 volatile 可以提供轻量级的同步。

三、volatile 的局限性 (不能做什么)

  • volatile 不能保证原子性:

    • volatile 只能保证可见性和有序性,不能保证原子性。
    • 对于复合操作(例如 i++),volatile 无法保证线程安全。 i++ 操作实际上包含三个步骤:读取 i 的值、将 i 的值加 1、将新值写回 i。 即使 i 是 volatile 的,这三个步骤也不是原子的,多个线程同时执行 i++ 仍然可能导致错误。
  • volatile 不能代替锁:

    • volatile 是一种轻量级的同步机制,它比锁的开销要小。
    • 但 volatile 的功能有限,只能用于特定场景,不能完全代替锁。
    • 如果需要保证复合操作的原子性,或者需要更复杂的同步控制,仍然需要使用锁(例如 synchronized 或 ReentrantLock)或原子类。

四、volatile 与 synchronized 的比较

特性volatilesynchronized
作用保证可见性、禁止指令重排序保证原子性、可见性、有序性
使用方式修饰变量修饰方法或代码块
性能轻量级,开销较小重量级,开销较大
阻塞不阻塞线程阻塞线程
死锁不会导致死锁可能导致死锁
原子性不保证原子性 (只保证单个 volatile 变量的读写操作的原子性)保证原子性 (被 synchronized 修饰的代码块或方法具有原子性)
使用场景状态标志、双重检查锁定单例模式、发布-订阅模式需要保证原子性、可见性和有序性的场景,例如对多个变量进行复合操作、实现复杂的同步逻辑
与 CAS 的关系CAS 操作通常需要 volatile 变量来保证可见性和有序性。 CAS 提供了原子性的比较并交换操作, 结合 volatile 变量的可见性, 就可以实现一些无锁的算法。synchronized 内部使用了监视器锁 (Monitor Lock) 来实现同步。 Java 对象头中的 Mark Word 用于存储锁的信息。 JDK 1.6 之后,synchronized 进行了优化,引入了偏向锁、轻量级锁、重量级锁等机制, 其中轻量级锁的实现就利用了 CAS。
实现JVM通过插入内存屏障实现JVM 基于进入和退出 Monitor Object 来实现方法同步和代码块同步, monitorenter 和 monitorexit. 代码块同步是使用 monitorenter 和 monitorexit 指令实现的,方法同步使用另一种方式实现(通常是添加 ACC_SYNCHRONIZED 标志)

总结:

  • volatile 是 Java 中的一个关键字,用于修饰变量,提供轻量级的同步机制。
  • volatile 的主要作用是保证可见性和禁止指令重排序,但不能保证原子性。
  • volatile 适用于状态标志、双重检查锁定单例模式、发布-订阅模式等场景。
  • volatile 不能代替锁,在需要保证复合操作的原子性或更复杂的同步控制时,仍然需要使用锁或原子类。
  • 理解 volatile 的原理和使用场景,可以帮助你编写正确的并发程序,避免可见性和有序性导致的问题。

五、 深入理解 volatile (高级主题)

  1. happens-before 关系:

    • Java 内存模型 (JMM) 定义了 happens-before 关系,用于描述操作之间的可见性。
    • 如果操作 A happens-before 操作 B,那么 A 的结果对 B 可见,并且 A 的执行顺序在 B 之前。
    • volatile 变量的写操作 happens-before 后续对该变量的读操作。
    • 这意味着,如果一个线程写入一个 volatile 变量,那么后续任何线程读取这个 volatile 变量,都能看到之前写入的值。
  2. 内存屏障 (Memory Barrier) 的细节:

    • 内存屏障是一种 CPU 指令,用于控制内存访问的顺序和可见性。
    • 不同的 CPU 架构有不同的内存屏障指令。
    • Java 内存模型 (JMM) 定义了一组抽象的内存屏障,JVM 会根据具体的 CPU 架构将这些抽象的内存屏障映射到具体的 CPU 指令。
    • volatile 关键字的实现依赖于内存屏障:
      • StoreStore 屏障: 禁止上面的普通写和下面的 volatile 写重排序。
      • StoreLoad 屏障: 强制刷新处理器缓存,确保其他处理器能够看到 volatile 变量的最新值。
      • LoadLoad 屏障: 禁止上面的 volatile 读和下面的普通读重排序。
      • LoadStore 屏障: 禁止上面的 volatile 读和下面的普通写重排序。
      • 更详细地说:
        • 在每个volatile写操作前插入StoreStore屏障。
        • 在每个volatile写操作后插入StoreLoad屏障。
        • 在每个volatile读操作后插入LoadLoad屏障。
        • 在每个volatile读操作后插入LoadStore屏障。
  3. volatile 与缓存一致性协议 (Cache Coherence Protocol):

    • 在多核处理器中,每个 CPU 核心都有自己的缓存(L1, L2, L3 缓存)。
    • 为了保证多个 CPU 核心之间的缓存数据一致性,需要使用缓存一致性协议(例如 MESI 协议)。
    • volatile 变量的写操作会触发缓存一致性协议,将新值写入主内存,并使其他 CPU 核心中该变量的缓存失效。
  4. volatile 与原子类的关系:
    原子类内部使用了volatile 和 CAS操作来实现原子性、可见性和有序性。 原子类中的变量通常会被声明为 volatile。

六、 最佳实践

  1. 明确 volatile 的适用场景: 不要滥用 volatile,只有在确实需要保证可见性和禁止指令重排序时才使用它。
  2. 理解 volatile 的局限性: volatile 不能保证原子性,不能代替锁。
  3. 优先使用原子类: 如果需要原子性操作,优先使用 Java 并发包提供的原子类 (例如 AtomicInteger, AtomicLong, AtomicReference 等),而不是直接使用 volatile 和 CAS。
  4. 谨慎使用双重检查锁定: 只有在 JDK 1.5 及以上版本,并且正确使用 volatile 关键字的情况下,双重检查锁定才是安全的。
  5. 结合具体场景分析: 对于复杂的并发场景,要仔细分析,确定是否需要使用 volatile,以及如何正确使用。

**总结 **

volatile 是 Java 并发编程中一个重要的关键字,它可以提供轻量级的同步机制,保证可见性和禁止指令重排序。 理解 volatile 的原理、作用、使用场景和局限性,是编写正确的并发程序的基础。 在实际开发中,要根据具体情况,合理使用 volatile、原子类、锁等同步机制,构建高效、可靠的多线程应用程序。 尽量避免直接使用底层的Unsafe类进行CAS操作。

Java中的volatile关键字的作用是什么? 可见性(Visibility):当一个变量被volatile修饰时,任何对该变量的修改都会立即被其他线程可见。这是因为volatile变量的修改会立即刷新到主内存(Main Memory),而其他线程读取该变量时会直接从主内存中获取最新的值,而不是使用线程自己的缓存。然而,这种重排序有时可能会导致多线程程序出现意料之外的行为。需要注意的是,虽然volatile关键字可以确保可见性和禁止指令重排序,但它并不能保证变量操作的原子性。变量时,线程会直接从主内存中获取最新的值,而不是使用线程自己的缓存。 阅读详情

相关推荐

学习笔记——神经科学的数学基础

m%3D2X_%7Bi%7DiNy%3DAxW%3DABx_%7Bj%7Dy_%7Bi%7Dy%3DWxt=N7T8卷积神经网络(CNN)详细介绍及其原理详解_IronmanJay的博客-优快云博客https://blog.youkuaiyun.com/IronmanJay/article/details/128689946?

zxyopenstar的博客 1374

Java中的volatile关键字的作用

volatile关键字是Java中一个非常重要的关键字,它可以保证共享变量的可见性和禁止指令重排序,但是无法保证原子性。在多线程编程中,我们应该根据具体情况选择使用volatile关键字或synchronized关键字,以保证程序的正确性和效率。

zhaoliubao1的博客 5466

告别Vysor!用Scrcpy在Mac上无线投屏安卓手机(附魅族16th闪退修复实战)

本文详细介绍了如何在Mac上配置和使用开源投屏工具Scrcpy,实现安卓手机无线投屏的高效解决方案。从基础环境准备到高级功能调优,包括无线连接配置、输入控制增强、多设备管理和性能优化等实用技巧,特别针对魅族16th等机型的闪退问题提供了修复方案,帮助用户彻底告别Vysor等商业软件。

weixin_28712661的博客 394

Java volatile的作用

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

o0way0o的博客 1541

从电商平台到微信私域:构建合规跳转链路的技术实现

在互联网营销与用户增长领域,链接跳转是连接不同平台、引导用户流量的基础技术。其核心原理是通过服务器端路由与参数解析,实现用户请求的接收、处理与重定向。这项技术的价值在于能够突破平台间的生态壁垒,实现流量的合规、可控迁移,尤其适用于跨平台营销、私域沉淀等场景。在实际应用中,常需处理微信环境限制、参数传递与动态内容生成等挑战。本文聚焦于电商平台(如淘宝)到微信生态的跳转需求,详细阐述了如何利用Node.js、Express框架及二维码生成技术,构建一个包含环境检测、参数传递与动态落地页的完整跳转系统,以解决微信

weixin_33889665的博客 323

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 467

java笔记——volatile的作用

因此,在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。如果对n的操作是原子级别的,最后输出的结果应该为n=1000,而在执行上面积代码时,很多时侯输出的n都小于1000,这说明n=n+1不是原子级别的操作。但是事实上,这段代码会完全运行正确么?

a25847a的博客 3549

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

java 关键字 volatile_java volatile关键字作用及使用场景

1. volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。如以下代码片段,isShutDown被置为true后,doWork方法仍有执行。如用volatile修饰isShutDown变量,可避免此问题。1 public classVolatileTest3 {2 static ...

weixin_30618305的博客 2778

uniapp - 微信支付报错 requestPayment:fail:HBuilder mainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,微信支付,报错,errMsg,requestPayment:fail:HBuildermainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包,http://ask.dcloud.net.cn/article/282,已经都检查了还是报错,如何解决这个问题,还是不行,错误,苹果微信支付报错,安卓app微信支付出错,打包,在线打包也不行,本地打包,支

🏆 前端领域优质创作者 3500

10、智慧变电站 - 加载vue大屏元素(整体效果)

这一篇文章非常简单,但是也非常出效果阅读前面几篇文章,都可以看到有顶部、左侧、右侧的面板,主要我不会录gif图片,大屏元素面板还有一些动态加载的效果。 vue的transition标签 Vue 提供了 transition 的封装组件,可以给任何元素和组件添加进入/离开过渡;在进入/离开的过渡中,会有 6 个 class 切换:v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to。我们正好使用这个特性来达到面板进入

github_39988036的博客 1039

java volatile关键字的作用_java volatile关键字作用及使用场景详解

1. volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。如以下代码片段,isShutDown被置为true后,doWork方法仍有执行。如用volatile修饰isShutDown变量,可避免此问题。public class VolatileTest3 {static class W...

weixin_30895873的博客 2545

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

k8291121的博客 1099

Java 中 volatile 关键字的作用及使用场景

在 Java 中,volatile关键字是一种轻量级的同步机制,它确保了对变量的读写操作不会被 JVM 优化,且对一个线程写入的值能够及时对其他线程可见。具体来说,volatile可见性:当一个线程修改了某个volatile变量的值,其他线程立即能够看到这个值的最新修改。禁止重排序:编译器和 JVM 不能对volatile变量的读写操作进行指令重排,确保操作顺序不会被改变。特性volatile关键字线程可见性保证线程间对变量的可见性保证线程间的可见性原子性不保证原子性保证原子性性能。

一碗黄焖鸡三碗米饭的博客 1773

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java并发编程(二)—volatile关键字的作用及使用场景

volatile在这篇文章多次提及volatile,这是一个非常重要的概念,主要用于多线程编程中,它确保了变量的可见性和禁止指令重排序,但不保证原子性,下面详细解释。

echola_mendes的博客 1403

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java volatile关键字作用及使用场景

java volatile关键字作用及使用场景 volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。如以下代码片段,isShutDown被置为true后,doWork方法仍有执行。如用volatile修饰isShutDown变量,可避免此问题。 public class VolatileTest3 { static class Work { boolean isShu

qq_40603010的博客 1565

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

面试题:请解释Java中的volatile关键字的作用,并举例说明在多线程环境下使用volatile关键字的场景以及它的局限性

volatile关键字在Java多线程编程中有一定的作用,主要用于保证变量的可见性和禁止指令重排序。它适用于一些简单的场景,如状态标志和单次赋值的共享变量,但在处理复合操作的原子性等方面存在局限性,在复杂的并发场景下需要结合其他并发工具来确保程序的正确性。

胡子发芽的博客 561

Java面试题:举例说明Java中的内存泄漏是如何产生的?请解释Java内存模型中的volatile关键字的作用和应用场景,请解释Java内存模型中的synchronized关键字的作用和应用场景

总结,Java内存模型是Java面试中的核心考点之一。通过理解内存泄漏、volatile关键字、synchronized关键字等概念,候选人能够展示出对Java内存模型的深入理解,并能够在实际开发中编写出高效、线程安全的代码。:理解synchronized关键字的作用,以及它在多线程编程中的应用场景。:此问题旨在考察对Java内存模型中synchronized关键字的理解。:理解volatile关键字的作用,以及它在多线程编程中的应用场景。:理解内存泄漏的概念,以及它在Java应用程序中的常见场景。

码农超哥的博客 428

Java 中的 volatile 是什么?

volatile 是 Java 中的一个轻量级同步机制,主要用于线程之间的变量可见性和禁止指令重排序。它不是用来代替 synchronized 的,而是适用于特定场景下的轻量并发控制。

[ta叫我小白]的专栏 540

volatile关键字的作用_volatile 关键字 - 可见性保证

Java的关键字 volatile 用于将变量标记为“存储于主内存中”。更确切地说,对 volatile 变量的每次读操作都会直接从计算机的主存中读取,而不是从 cpu 缓存中读取;同样,每次对 volatile 变量的写操作都会直接写入到主存中,而不仅仅写入到 cpu 缓存里。实际上,从 Java 5 开始关键字 volatile 除了能确保 volatile 变量直接从主存中进行读写,还有以下...

weixin_39639698的博客 502

volatile关键字的作用_volatile关键字及其作用

本文主要介绍Java语言中的volatile关键字,内容涵盖volatile的保证内存可见性、禁止指令重排等。废话不多说,直接进去主题1 保证内存可见性1.1 基本概念可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。1.2 实现原理当对非volatile变量进行读写的时候,每个线程先从主内存拷贝变量到CPU缓存中,如果计算机有多...

weixin_39576336的博客 396

深入理解和使用volatile关键字

好了,现在咱们来深入了解一下volatile这个“神秘”的关键字。在Java中,volatile是一种用于声明变量的修饰符。它告诉JVM和编译器,这个变量可能会被多个线程同时访问,而且还不通过锁来控制。这听起来有点像是给变量加了一个“注意”标签,让它在并发环境下表现得更好。首先,小黑给大家强调一下,volatile主要解决的是可见性问题。可见性,就像它字面上的意思,确保当一个线程修改了volatile变量的值时,其他线程能够立即知道这个改变。这听起来很简单,但在并发编程中,这个特性非常重要。为什么呢?

宋小黑的博客 929

volatile的作用和基本使用

一、为什么改了值线程不可见? 上一节讲到了怎样创建一个线程,于是写出了一个多线程代码 public class HelloVolatile { boolean flag = true; void circle() { System.out.println("start"); while(flag) { } System...

乌金小河的博客 354

java volitate关键字_java volatile 关键字

volatile 关键字能把 Java 变量标记成"被存储到主存中"。这表示每一次读取 volatile 变量都会访问计算机主存,而不是 CPU 缓存。每一次对 volatile 变量的写操作不仅会写到 CPU 缓存,还会刷新到主存中。实际上从 Java 5 开始,volatile 变量不仅会在读写操作时访问主存,他还被赋予了更多含义。变量的可见性问题Java volatile 关键字保证了线程对...

weixin_35715440的博客 996
上一篇: TCP的四次挥⼿为什么是四次?为什么不能是三 次
下一篇: 责任链模式详解和在Spring Boot 项目中的使用场景
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

冰糖心书房

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

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

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

打赏作者

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

抵扣说明:

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

余额充值