`

【Java线程安全】volatile 关键字

    博客分类:
  • Java
 
阅读更多

为什么要用 volatile

  1. 某些程序判断逻辑的正确性依赖于程序执行语句的顺序。为了实现更好程序性能,Java编译器可能会通过改变内部指令的顺序来优化。当遇到多线程场景时,程序所依赖的语句执行顺序可能被破坏,进而导致逻辑判断出错
  2. 多线程环境中,部分线程可能会在某些时刻使用缓存在CPU寄存器中的副本数据,而不是直接从主内存获取(多核CPU中每个核心也可以有自己的缓存)。这会导致不同的线程使用了不同的数据,进而导致其它异常

volatile 的作用

通过用 volatile 修饰字段可以达到以下作用:

  • volatile 会将对目标字段的读写操作直接指向主内存,而不是寄存器等缓存
    • 这避免了前文第2点情况,保证其它线程都能读到最新的值
  • 针对被volatile修饰的字段的读写操作不会被编译器“优化”
    • 这避免了前文第1点情况,保证读写的顺序就是编码时规定的顺序。
    • 如,如果代码中对某 volatile 修饰的字段的操作是先写再读,那么读操作可能会在写操作之后再执行

其它

  • volatile 关键字可以用于类中的字段,但不能用于局部变量
    • 局部变量是线程内部的数据,不是共享数据,所以volatile对其没有意义
  • 对 volatile 修饰的 long 和 double 类型字段的读写也是原子性的
  • 对 volatile 修饰字段的更改不需要互斥,所以volatile 关键字用得好,可以避免使用锁,提高性能
    • 但 volatile 的目的并不是替代 synchronized
分享到:
评论

相关推荐

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    java里的volatile关键字详解

    Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见性是一种复杂的属性,因为可见性...

    Java并发编程:volatile关键字解析

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

    深入解析Java中的volatile关键字:原理、应用与实践

    在Java并发编程中,volatile关键字是一种轻量级的同步机制,它用于确保变量的可见性和有序性。本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发...

    Java多线程 volatile关键字详解

    Java多线程volatile关键字详解 Java多线程volatile关键字详解主要介绍了Java多线程volatile关键字的应用和原理。volatile是一种轻量同步机制,可以确保变量的可见性和顺序性,但不保证原子性。 volatile关键字的...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

    多方面解读Java中的volatile关键字.rar

    总的来说,`volatile`关键字是Java并发编程中的一个重要工具,理解其背后的内存模型和语义对于编写高效、线程安全的代码至关重要。然而,使用时应谨慎,因为它并不提供全面的线程保护,必须结合具体场景和需求来正确...

    Java并发编程volatile关键字的作用

    在 Java并发编程中,volatile关键字是一个非常重要的知识点,开发者需要深入了解volatile关键字的作用和使用场景,以便更好地使用volatile关键字来保证线程安全。 此外,volatile关键字的使用还需要注意以下几点: ...

    线程安全、volatile关键字、原子性、并发包、死锁、线程池.md

    线程安全、volatile关键字、原子性、并发包、死锁、线程池学习笔记

    Java并发volatile关键字.docx

    Java并发编程中,volatile关键字扮演着重要的角色,它是一种轻量级的同步机制,与synchronized相比,volatile在性能上更优,因为它不会导致线程阻塞。在深入理解volatile的关键特性之前,我们需要先了解Java内存模型...

    详细分析java并发之volatile关键字

    Java 中的 volatile 关键字是 Java 并发编程中的一种关键字,它用于修饰变量,确保在多线程环境下变量的可见性和有序性。volatile 关键字的主要作用是防止编译器对变量的读写优化,确保线程之间的可见性和有序性。 ...

    深入了解java并发的volatile关键字的底层设计原理.docx

    `volatile`关键字在Java语言中主要用于支持多线程环境下的变量访问安全性。它主要提供了以下两个特性: 1. **可见性**:当一个线程修改了一个被`volatile`关键字修饰的变量后,其他线程能够立即感知到这一变化。 2. ...

    深入理解Java中的volatile关键字(总结篇)

    在Java并发编程中,volatile关键字是非常重要的一个关键字,它可以提供可见性和有序性保障,确保多个线程之间对内存写入操作的可见性。同时,volatile关键字也可以用来代替synchronized关键字,在某些情况下可以提高...

    深入理解 volatile 关键字.doc

    深入理解volatile关键字 ...volatile关键字是一个强大的工具,但需要正确地使用它,以避免线程安全问题。在使用volatile关键字时,需要遵守相关的规则,并且需要弄清楚Java内存模型,以免出现不必要的错误。

    Java中volatile关键字实现原理

    volatile关键字是Java语言中的一种机制,用于保证变量在多线程之间的可见性。它是Java.util.concurrent包的核心,没有volatile就没有那么多的并发类供我们使用。本文详细解读一下volatile关键字如何保证变量在多线程...

    Java多线程之volatile关键字及内存屏障实例解析

    总结来说,volatile关键字在Java多线程编程中起着关键作用,它提供了轻量级的同步机制,通过内存屏障保证了变量的可见性和有序性,避免了多线程环境下数据不一致的问题。但需要注意的是,volatile不能保证操作的原子...

    C++中volatile关键字及常见的误解总结

    在C++中,volatile关键字的定义与Java中的volatile关键字不同。C++中的volatile关键字主要用于提供对特殊地址的稳定访问,而不是用于线程同步。 在编译器对代码的优化中,编译器可能会对代码进行修改,以提高代码的...

    Java并发教程之volatile关键字详解

    在Java中,volatile关键字是解决多线程问题的重要工具。本文将会详细介绍volatile关键字的原理、使用场景和注意事项。 知识点1:理解多线程问题 在多线程环境下,线程安全问题是最重要的问题。Java内存模型(JMM)...

    Java中volatile关键字的总结.docx

    Java中的`volatile`关键字是用于处理并发编程中线程间通信和可见性的重要工具。它是一种轻量级的同步机制,比`synchronized`锁更为高效,因为它不会导致线程上下文的切换和调度,减少了不必要的开销。然而,`...

    Java中Volatile关键字详解及代码示例

    在Java中,Volatile关键字可以用于解决可见性问题,例如在多线程环境下,一个线程修改的变量对另一个线程是可见的。但是,Volatile关键字不能解决原子性问题,例如a++操作是一个非原子操作,需要使用同步技术来让它...

Global site tag (gtag.js) - Google Analytics