Java中synchronized关键字可以保证变量的同步,Java还有一个稍弱的同步机制,即volatile变量。volatile用户确保将变量的更新操作同步通知到其它线程。
volatile变量具备两种特性:一种是保证该变量对所有线程可见,在一个线程修改了变量的值后,新的值对于其它线程时可以立即获取的;一种是volatile禁止指令重排,即volatile变量不会被缓存在寄存器或者其它处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
对所有线程可见
因为在访问volatile变脸时不会执行加锁操作,也就不会执行线程阻塞,因此,volatile变量是一种比synchronized关键字更轻量级的同步机制。volatile主要适用于一个变量被多个线程共享,多个线程均可针对这个变量执行赋值或者读取的操作。
在有多个线程对普通变量进行读取时,每个线程都首先须要将数据从内存中复制变量到CPU缓存中,如果计算机有个多CPU,则线程可能都在不同的CPU中被处理,这意味着每个线程都须要将同一个数据复制到不同的CPU cache中,这样每个线程都针对同一个变量的数据做了不同的处理后就可能存在数据不一致的情况。多线程对普通变量读写流程见下图