Java 并发面试题, 什么是 Java 中的原子性,可见性和有序性?
Java 并发面试题, 什么是 Java 中的原子性,可见性和有序性?
QA
Step 1
Q:: 什么是 Java 中的原子性?
A:: 原子性是指操作是不可分割的,不能被线程调度机制打断。即使在多线程环境下,某个操作一旦开始执行,就会一直执行下去,中间不会被打断。例如,Java 中的原子操作包括基本数据类型的读写和 Atomic 类的操作。
Step 2
Q:: 什么是 Java 中的可见性?
A:: 可见性是指一个线程对共享变量的修改,能及时被其他线程看到。Java 使用 volatile 关键字、synchronized 关键字和显示锁(如 ReentrantLock)来保证可见性。volatile 保证了变量在多个线程之间的可见性,synchronized 和 ReentrantLock 则通过内存屏障(Memory Barrier)确保可见性。
Step 3
Q:: 什么是 Java 中的有序性?
A:: 有序性是指程序执行的顺序按照代码的先后顺序进行。由于编译器和处理器的优化,程序的实际执行顺序可能与代码顺序不一致。Java 通过 volatile 和 synchronized 保证有序性。volatile 禁止指令重排序,synchronized 保证进入临界区的代码按顺序执行。
Step 4
Q:: volatile 关键字的作用是什么?
A:: volatile 关键字用于保证变量的可见性和禁止指令重排序。被 volatile 修饰的变量在被一个线程修改后,其他线程能够立即看到修改的值,避免了缓存不一致问题。volatile 还禁止编译器和处理器对该变量进行指令重排序,从而保证代码的有序性。
Step 5
Q:: synchronized 关键字如何保证线程安全?
A:: synchronized 关键字通过锁机制确保同一时间只有一个线程可以进入被 synchronized 修饰的代码块或方法,从而避免了多个线程同时修改共享变量导致的不一致问题。它还通过内存屏障确保临界区内变量的可见性。