Java 面试宝典:volatile 的使用场景有哪些?
内容提要
volatile是一种轻量级的同步机制,确保共享变量的可见性和操作的有序性,但不能确保原子性。适用于多个线程读、一个线程写的场景,如状况标志、DCL的单例模式和开销较低的读-写锁策略。要正确使用volatile,写入变量不能依赖于旧值,变量不能参与其他变量的不变性条件。
关键要点
-
volatile 是一种轻量级的同步机制,确保共享变量的可见性和操作的有序性,但不能确保原子性。
-
使用 volatile 必须满足两个条件:写入变量不依赖于当前值,变量不参与其他变量的不变性条件。
-
volatile 适合多个线程读、一个线程写的场景,如状况标志、DCL 的单例模式和开销较低的读-写锁策略。
-
状况标志:使用 volatile 确保线程能及时看到状态变化。
-
DCL 的单例模式:使用 volatile 防止指令重排序,确保线程安全的单例实例初始化。
-
开销较低的读-写锁策略:允许多个线程读取资源,但只允许一个线程写入,适合读多写少的场景。
-
在 J.U.C 中,ReentrantReadWriteLock 提供了读写锁机制,支持多个线程同时读取和单个线程写入。
延伸问答
什么是volatile,它的主要功能是什么?
volatile是一种轻量级的同步机制,确保共享变量的可见性和操作的有序性,但不能确保原子性。
使用volatile时需要满足哪些条件?
使用volatile时,写入变量不能依赖于当前值,且变量不能参与其他变量的不变性条件。
volatile适合于哪些场景?
volatile适合多个线程读、一个线程写的场景,如状况标志、DCL的单例模式和开销较低的读-写锁策略。
什么是状况标志,如何使用volatile实现?
状况标志是用一个变量控制线程执行流程,使用volatile可以确保其他线程及时看到状态变化。
DCL单例模式中volatile的作用是什么?
在DCL单例模式中,volatile用于防止指令重排序,确保线程安全的单例实例初始化。
如何使用volatile和锁实现低开销的读-写锁策略?
可以使用volatile来允许多个线程读取资源,同时使用锁确保只有一个线程可以写入,从而减少开销。