2023-01-29
班门弄斧
00
请注意,本文编写于 681 天前,最后修改于 198 天前,其中某些信息可能已经过时。

目录

简介
与static比较
与synchronized比较
volatile的真实作用

简介

volatile在Java中,是一个关键字,只能用于修饰属性,作用是保证数据一致性,是一种线程安全的简单实现。

static比较

理论上讲,static修饰的属性,在全局中只有一个内存,无论何时何地何处,读取其属性值,都是那一个内存,那么起作用是不是与volatile作用一样呢?

  • volatile声明变量值的一致性;static声明变量的唯一性。

synchronized比较

既然说到了线程安全,就不得不讲讲synchronized关键字了。

  • volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定要比 synchronized 关键字好;
  • volatile 关键字只能修饰变量,而 synchronized 关键字可以修饰方法以及代码块;
  • 多线程访问 volatile 关键字不会发生阻塞,而 synchronized 关键字可能会发生阻塞;
  • volatile 关键字是保证数据的可见性,但不保证数据的原子性,而 synchronized 关键字两者都能保证;
  • volatile 关键字解决的是变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程间访问资源的同步性。

volatile的真实作用

volatile的真实作用是:防止Java指令重排序!

Java自身有一个机制:在某些情况下,改变代码执行顺序,不会改变其最终的结果,这类代码在Java底层编译执行时,可能会自动进行重新排序,并不严格按照代码的编写顺序去执行。这种机制一般称之为Java指令重排序

ps:想要详细了解Java指令重排序可自行百度。

有时,Java指令重排序会导致预料之外的代码逻辑bug,当出现这种情况时,可以对确定不希望重排序的代码增加volatile关键字。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!