volatile是什么
volatile关键字在Java中是一个轻量级的同步机制,用于保证变量的可见性和防止指令重排序。它主要用于多线程环境下共享变量的访问,确保每个线程都能看到变量的最新值。volatile与synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。 volatile的用法比较简单,只需要在声明一个可能被多线程同时访问的变量时,使用volatile修饰就可以了。
static volatile int temp =0;
此时temp变量也就具有可见和有序性。
volatile的特性
保证线程间的可见性
volatile关键字确保一个线程对变量的修改可以立即被其他线程看到。通常,在没有volatile时,一个线程对变量的修改可能会被缓存到线程本地的CPU缓存中,其他线程无法立即看到这种修改。而volatile变量会直接存储在主内存中,每次读取时都直接从主内存中读取最新的值,每次写入时也会直接写入主内存。
禁止指令重排序
volatile关键字可以禁止指令重排序优化。编译器和处理器在执行程序时,为了提高性能,可能会对指令进行重排序。在单线程环境下,这不会有问题,但在多线程环境下可能会导致严重的并发问题。用 volatile 修饰共享变量后,会在读、写共享变量时加入不同的内存屏障,阻止其他读写操作越过屏障,使得在写入volatile变量之前的指令不会被重排序到它之后,读取volatile变量之后的指令不会被重排序到它之前,从而达到阻止重排序的效果。