`
flychao88
  • 浏览: 753175 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Volatile的用法范围

 
阅读更多

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

分享到:
评论

相关推荐

    extern_volatile等修饰符的用法

    "extern_volatile等修饰符的用法" 在C++语言中,extern、volatile、const、static等修饰符都是非常重要的,它们可以影响变量的存储方式、生命周期和访问权限等。本文将详细介绍这些修饰符的用法和特点。 一、const...

    const和volatile分析

    在此,我们将深入探讨`const`和`volatile`的含义、用法及其在实际编程中的应用。 `const`关键字: 1. `const`的基本概念:`const`用来声明常量,即一旦赋值后就不能改变的变量。它帮助编译器检查代码中是否有尝试...

    C语言中volatile的用法

    本文将深入探讨`volatile`的关键作用及其正确使用方法。 #### `volatile`的基本概念 `volatile`的原意在英文中有“易变的”或“暂态的”之意,在C语言中,当我们将一个变量声明为`volatile`时,我们告诉编译器不要...

    const extern static volatile 小结

    - **内存管理**:利用 `static` 控制变量的生命周期和可见范围,优化内存使用。 - **数据共享**:通过 `extern` 实现跨文件的数据共享,提高程序模块间的协作效率。 - **并发控制**:使用 `volatile` 标记那些在多...

    面试官最爱的volatile关键字.docx

    1. volatile只能修饰实例变量和类变量,而synchronized可以作用于方法和代码块,提供了更广泛的控制范围。 2. volatile仅保证数据的可见性和有序性,而不保证原子性,而synchronized则是全面的同步机制,既保证可见...

    volatile和synchronized的区别

    1. **应用范围**:`volatile`只能应用于变量级别,而`synchronized`可以应用于变量、方法甚至是代码块级别。 2. **性能差异**:通常情况下,`volatile`的性能优于`synchronized`。这是因为`synchronized`会导致线程...

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

    然而,开发者需要注意其适用范围的局限性,并确保在使用`volatile`变量时遵循上述提到的条件。当处理更复杂的同步需求时,如需要原子性的复合操作或维护多个变量之间的不变式关系,应该考虑使用更强大的同步工具,...

    Java中Volatile的作用实例解析

    当使用 volatile 变量而非锁时,某些习惯用法(idiom)更加易于编码和阅读。此外,volatile 变量不会像锁那样造成线程阻塞,因此也很少造成可伸缩性问题。 在某些情况下,如果读操作远远大于写操作,volatile 变量...

    简单了解java volatile关键字实现的原理

    1. **使用范围**:`volatile`只能修饰变量,而`synchronized`可以修饰方法和代码块。 2. **原子性保证**:`volatile`无法保证操作的原子性,如`i++`操作,而`synchronized`可以确保整个同步块内的操作是原子性的。 ...

    Java关键字volatile和synchronized作用和区别

    volatile和synchronized关键字的主要区别在于它们的作用范围和机制。volatile关键字只作用于变量,而synchronized关键字则作用于一段代码或方法。volatile关键字是通过禁止缓存来实现同步的,而synchronized关键字则...

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

    Java编程中常用修饰词使用方法

    Java 编程中常用修饰词使用方法 Java 语言中定义了 11 个常用的修饰词,每个修饰词都有其特定的使用场景和作用。下面对这 11 个 Java 修饰词进行详细的介绍: 1. public 修饰词 修饰对象:类、接口、成员 介绍:...

    Android 平凡之路

    3. **作用范围**:`synchronized`可以作用于方法级和代码块级,而`volatile`只能作用于变量级。 4. **原子性保证**:`synchronized`可以保证复合操作的原子性,而`volatile`则不能。 总之,`volatile`是一种轻量级...

    C语言几个重要的关键字之用法[归类].pdf

    需要注意的是,`#define`定义的常量没有类型检查,可能导致溢出问题,像在这个例子中,如果在16位机器上,不使用`L`或`UL`来指定长整型,结果可能会超出普通整型的范围。另外,使用`#define`时不应以分号结束,因为...

    JAVA线程操作

    - **适用范围**: `volatile`变量主要用于保证单个变量的可见性和有序性,而`synchronized`可以用来保护整个代码块或方法的执行。 - **原子性**: `volatile`只能保证简单类型的原子性操作,而`synchronized`可以确保...

    synchronized关键字的实质及用法

    - **代码块同步**:使用`synchronized`关键字包围代码块,锁定对象是显式指定的,这样可以更精确地控制锁定范围。 ```java synchronized (someObject) { // ... } ``` 2. **监视器锁机制** `synchronized...

    extern声明辨析

    这种方法可以确保双方使用的函数声明一致,减少因参数不匹配引起的错误。 #### 5. `extern "C"`声明 **问题**:在C++环境中使用C语言函数时,如何避免链接错误? **答案与分析**: - 在C++中,由于名称修饰(name...

    Java 中 synchronized的用法详解(四种用法)

    Java 中的 `synchronized` 关键字是多线程编程中的重要概念,用于实现线程同步,确保在并发环境下数据的一致性和完整性。...在某些情况下,可以使用 volatile 关键字来避免使用锁,但这是另一个话题了。

    Java的线程安全内存模型.docx

    它可以用于修饰类、方法或代码块,根据不同的用法,作用于不同范围的对象。此外,Java还提供了读写锁(ReentrantReadWriteLock),在多读少写的情况下,可以提高并发性能,因为读操作可以并发进行,但写操作会独占...

    修复JAVA内存模型1

    5. **Synchronized的改进**:synchronized关键字的作用范围扩大,现在它不仅提供互斥访问,还保证了在进入和离开同步块/方法时的内存屏障,确保了线程间的可见性。 理解并正确使用JMM对于编写高性能、线程安全的...

Global site tag (gtag.js) - Google Analytics