Java 并发面试题, 什么是 Java 的 happens-before 规则?
Java 并发面试题, 什么是 Java 的 happens-before 规则?
QA
Step 1
Q:: 什么是 Java 的 happens-
before 规则?
A:: Java 的 happens-before 规则是 Java 内存模型 (JMM) 的一部分,定义了两个操作之间的可见性关系。如果一个操作 happens-
before 另一个操作,那么第一个操作的结果对第二个操作可见,并且第一个操作的顺序排在第二个操作之前。具体规则包括:
1.
程序顺序规则:在一个线程内,按照程序的顺序执行。
2. 监视器锁规则:一个锁的解锁 happens-
before 该锁的加锁。
3. volatile 变量规则:对一个 volatile 变量的写操作 happens-
before 读操作。
4. 线程启动规则:Thread.start() 方法 happens-
before 线程内部的任何操作。
5. 线程终止规则:线程中的所有操作 happens-
before 其他线程检测到这个线程已经结束。
6. 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-
before C。
Step 2
Q:: 为什么需要 happens-
before 规则?
A:: happens-
before 规则确保了线程间的内存可见性,避免了数据竞争,从而保证程序的正确性。在多线程环境下,如果没有这些规则,就可能会出现一个线程看不到其他线程修改后的变量值的情况,导致难以预料的错误和不一致的状态。
Step 3
Q:: 什么是 Java 内存模型(JMM)?
A:: Java 内存模型定义了 Java 虚拟机(JVM)如何在多线程环境下共享变量。JMM 规定了如何从主内存和线程的本地内存之间传递变量。它解决了多线程访问共享变量时的可见性、原子性和有序性问题。
Step 4
Q:: volatile 关键字在 Java 中的作用是什么?
A:: volatile 关键字用于声明一个变量是易变的,这意味着对这个变量的读写操作会直接从主内存中进行,而不是使用线程的本地缓存。这样可以确保在多线程环境下,一个线程对 volatile 变量的修改会立即对其他线程可见,从而避免了内存可见性问题。
Step 5
Q:: synchronized 关键字如何工作?
A:: synchronized 关键字用于同步方法或代码块,确保同一时刻只有一个线程可以执行被 synchronized 修饰的代码。它实现了互斥锁的功能,确保线程间对共享资源的互斥访问。synchronized 还确保了锁释放之前对共享资源的修改对后续获得锁的线程可见,从而解决了内存可见性问题。