请解释 Java 中 volatile 关键字的作用,并说明其适用的典型场景。
考察说明
考查对 volatile 语义和适用场景的掌握程度。
回答思路
- 【回答框架 1】volatile 是 Java 提供的轻量级同步机制,用于保证共享变量的可见性和禁止指令重排序,但不保证原子性。
- 【回答框架 2】可见性:volatile 写操作会立即刷新到主内存,读操作会从主内存重新读取,从而避免线程各自缓存造成的数据不一致。
- 【回答框架 3】禁止重排序:volatile 通过内存屏障限制编译器和处理器对相关指令的重排序,避免单例双重检查锁等场景中的未完整初始化问题。
- 【回答框架 4】典型场景:状态标志位、双重检查锁中的实例引用、以及不依赖原子性的发布操作。但复合操作如 i++ 无法用 volatile 保证线程安全。
- 【关键点 1】volatile 保证可见性和有序性,不保证原子性。
- 【关键点 2】volatile 写读通过内存屏障实现,具备 happens-before 关系。
- 【关键点 3】volatile 适合单写多读场景,不适合复合操作。
- 【易错点 1】误以为 volatile 可以替代锁,实际无法保证复合操作原子性。
- 【易错点 2】忽略 volatile 对重排序的限制,导致依赖可见性但不禁止重排序的错误假设。
- 【易错点 3】将 volatile 用于非原子性复合操作(如计数)导致线程安全问题。