`

volatile变量

 
阅读更多

volatile变量

 

volatile变量是一种同步的弱形式。它确保对一个变量的更新以可预见的方式告知其他的线程。当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。所以,读一个volatile类型的变量时,总会返回由某一线程所写入的最新值。

 

volatile变量对可见性的影响所产生的价值远远高于变量本身,线程A向volatile变量写入值,随后线程B读取该变量,所有A执行写操作前可见的变量的值,在B读取了volatile变量后,成为对B也是可见的,所以从内存可见性的角度来看,写入volatile变量就像退出同步块,读取volatile变量就像进入同步块。依赖volatile变量来控制状态可见性的代码,比使用锁的代码更脆弱,更难以理解。

 

看一下代码示例:volatile变量的典型应用:检查状态标记,以确定是否退出一个循环。

public class CountingSheep {
    volatile boolean asleep;

    void tryToSleep() {
        while (!asleep)
            countSomeSheep();
    }

    void countSomeSheep() {
        // One, two, three...
    }
}

 

volatile变量固然方便,但也存在限制。它们通常被当作标识完成,中断,状态的标记使用。

要特别注意:volatile的语义不足以使自增操作原子化,除非你能保证只有一个线程对变量执行写操作。(原子变量提供了“读-改-写”原子操作的支持,而且常被用作“更优的volatile变量”)。


加锁可以保证可见性与原子性;volatile变量只能保证可见性。

 

只有满足了下面所有的标准后,你才能使用volatile变量:

1.写入变量时不依赖变量的当前值;或者能够确保只有一个线程修改变量的值;

2.变量不需要与其他的状态变量共同参与不变约束;

3.访问变量时,没有其他的原因需要加锁。

分享到:
评论

相关推荐

    volatile 变量的说明

    volatile变量在编程语言中,尤其是Java和C/C++中,是一种特殊的标识符,用于指示编译器该变量的值可能在编译器不知情的情况下发生变化。这个关键字的主要作用是告诉编译器不要对这个变量进行优化,每次使用时都需要...

    stm32 volatile变量的正确使用

    ### STM32中Volatile变量的正确使用 #### 概述 在嵌入式系统编程中,`volatile`关键字的正确使用对于确保程序的稳定性和可靠性至关重要。它主要用于标记那些可能在程序运行过程中被外部因素(如硬件中断、多线程...

    java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx

    ### Java入门教程:数据类型与正确使用Volatile变量 #### 概述 在Java编程语言中,`volatile`关键字提供了一种轻量级的同步机制,用于确保共享变量的可见性和一定程度上的线程安全性。相比于传统的锁机制如`...

    深入探讨Java多线程中的volatile变量共6页.pd

    本资料《深入探讨Java多线程中的volatile变量》将带你深入理解这个概念,全面解析其工作原理和实际应用。 volatile关键字在Java中主要用于解决多线程环境下的可见性和有序性问题。它确保了被volatile修饰的变量对...

    loveincode#notes#实现内存可见的两种方法比较:加锁和volatile变量1

    加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相

    quronghui#Embedded-written-reference#嵌入式的volatile变量1

    使用volatile变量的例子1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Non-automaticvari

    Java并发编程(5)volatile变量修饰符-意料之外

    在Java编程语言中,`volatile`关键字是一个非常重要的并发控制机制,它被用来修饰类的成员变量,确保这些变量在多线程环境下的可见性和有序性。然而,使用`volatile`并非总是如我们所期望的那样简单,有时会出现一些...

    Java 理论与实践: 正确使用 volatile 变量 线程同步

     而volatile关键字是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。  使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,...

    Linux C中多线程与volatile变量

    综上所述,`volatile`在Linux C多线程编程中主要用于解决共享变量的可见性问题,但在处理多线程同步时,还需要结合其他的同步机制,如互斥锁(`mutex`)、条件变量等,以确保线程安全。理解`volatile`的关键在于它是...

    volatile变量的的概念和使用

    在C语言编程中,`volatile`是一个非常重要的关键字,它用于修饰变量,向编译器传达特殊的指示。本文将深入探讨`volatile`变量的概念、作用以及如何在实际编程中使用。 `volatile`变量的主要概念是它表明该变量的值...

    Java线程:volatile关键字

    正确使用 volatile 变量的条件是:对变量的写操作不依赖于当前值,以及该变量没有包含在具有其他变量的不变式中。在实际应用中,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量...

    Java Volatile 变量详解及使用方法

    Java中的`volatile`关键字是用来修饰变量的,它主要用于解决多线程环境下的数据同步问题。在Java语言中,`volatile`变量提供了一种轻量级的同步机制,它确保了共享变量的可见性和有序性,但并不保证原子性。 **可见...

    Java并发编程之volatile变量介绍

    即当一个线程修改了volatile变量,其他线程能够立即看到这个变化,无需通过缓存或内存屏障来同步。这是因为volatile变量不会被存储在处理器的寄存器或本地线程存储中,而是直接在主内存中操作。因此,每次读取...

    这个例子中包含多个线程和一个共享的volatile变量

    SharedData结构包含了一个volatile的布尔型变量isProduced和isConsumed,以及一个整型变量data。 生产者线程负责生产数据并更新isProduced标志。 消费者线程等待isProduced标志为true,然后消费数据并更新isConsumed...

    深入探讨Java多线程中的volatile变量

    Java多线程中的volatile变量是实现线程间通信的关键机制之一。它主要用于解决并发环境下的可见性和有序性问题,但不保证原子性。在多线程编程中,当多个线程共享同一变量时,可能会遇到数据不一致的问题,因为每个...

    loveincode#notes#volatile变量修饰符1

    这就可能造成一个线程在主存中修改了一个变量的值,而另一个线程还在继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。volatile是一种稍弱的同步机制,在访

    Volatile详解,深入学习Volatile

    - 防止编译器优化:编译器通常会优化掉被认为不变的变量的读取,但volatile变量告诉编译器不要做这样的优化,每次使用时都从内存中读取。 - 多线程同步:在多线程环境中,当一个线程修改了volatile变量,其他线程...

Global site tag (gtag.js) - Google Analytics