volatile是Java中的一个关键字,用于修饰变量。使用volatile关键字修饰的变量具有以下特点:
1. 可见性:
当一个线程修改了volatile变量的值时,该变量的新值会立即被写回主内存,同时通知其他线程该变量的值已经发生了改变。其他线程在读取该变量时,会从主内存中获取最新的值,而不是使用自己线程栈中缓存的值。因此,volatile关键字可以保证变量对所有线程的可见性。
2. 有序性:
当一个线程对volatile变量进行写操作时,之后的所有操作都不能重排序到该写操作之前;当一个线程对volatile变量进行读操作时,之前的所有操作都不能重排序到该读操作之后。volatile关键字可以保证变量的写操作和读操作按照程序代码的顺序发生。
由于volatile变量具有可见性和有序性的特点,它适用于以下场景:
1. 状态标志:
当一个变量用于多线程之间的协同操作,作为状态标志来控制线程的执行,可以使用volatile关键字来保证对该标志的修改对所有线程可见。
2. 双重检查锁定(Double-Checked Locking):
在单例模式的双重检查锁定中,为了保证单例对象在多线程下的正确构造,使用volatile关键字修饰单例对象的引用,从而保证变量的可见性,并防止指令重排序带来的线程安全问题。
需要注意的是,虽然volatile关键字可以保证变量对所有线程的可见性,但它并不能保证原子性。对于包括读取-修改-写入在内的复合操作,仍然需要使用锁或其他同步机制来确保原子性操作。