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
关键字。
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!