介绍Volatile变量之前,我们需要了解一下两个概念:
如何保证线程中数据的一致性呢,首先我们可以利用synchronize同步操作,即多个线程在同一个时间内只能有一个线程访问该资源变量,这样保证了原子性的操作,同时,我们还有另外一种方法,即我们在线程操作的同时,可以将处理完的结果给到另外一个也是正在处理该数据的线程,保证资源的可见性,这时候就是利用的volatile。
Volatile变量:
本质在于告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中去读取。synchronize则是将该变量锁住,不让你能被其他线程访问。
volatile只能使用在变量中,synchronize可是使用在方法和变量上。
Volatile变量具有synchronize的可见,但是不具有原子性。
因此只有在状态真正独立于程序内其他内容时才能使用 volatile —— 这条规则能够避免将这些模式扩展到不安全的用例。
使用volatile需要具备以下两个特征:
-
对变量的写操作不依赖于当前值。
-
该变量没有包含在具有其他变量的不变式中。
-
volatile会禁止指令重排。