volatile关键字修饰的变量是否线程安全

2022-07-30 14:47:25

volatile关键字

Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile 变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取 volatile 类型的变量时总会返回最新写入的值。

变量可见性

其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的 值对于其他线程是可以立即获取的。

禁止重排序

volatile 禁止了指令重排。

在 Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。


在访问 volatile 变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此 volatile 变量是一 种比 sychronized 关键字更轻量级的同步机制。

volatile 适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。

当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有 多个 CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。


volatile关键字是否可以保证线程安全

不能,想要保证线程安全必须保证原子性,可见性,有序性。而volatile只保证了可见性和有序性

  • 作者:土豆面包
  • 原文链接:https://blog.csdn.net/qq_40177015/article/details/115445904
    更新时间:2022-07-30 14:47:25