Java 并发面试题, Synchronized 和 ReentrantLock 有什么区别?
Java 并发面试题, Synchronized 和 ReentrantLock 有什么区别?
QA
Step 1
Q:: Synchronized 和 ReentrantLock 有什么区别?
A:: Synchronized 是 Java 的关键字,用于实现同步,保证同一时间只有一个线程访问同步代码块。ReentrantLock 是 java.util.
concurrent 包中的类,提供了更高级的锁功能,如可以尝试获得锁、超时获得锁和中断获取锁。Synchronized 是 JVM 层面实现的,ReentrantLock 是 Java 层面实现的。Synchronized 无法手动释放,ReentrantLock 需要手动释放。
Step 2
Q:: Synchronized 和 ReentrantLock 在性能上有什么差异?
A:: 在低竞争的情况下,Synchronized 的性能通常比 ReentrantLock 更好,因为 JVM 能对 Synchronized 进行许多优化。在高竞争的情况下,ReentrantLock 由于其提供的更多灵活性(如公平锁机制)可能表现更好。
Step 3
Q:: 如何选择使用 Synchronized 还是 ReentrantLock?
A:: 如果需要简单的同步机制并且锁竞争不高,使用 Synchronized 会更简洁和高效。如果需要更多的控制和灵活性,比如公平锁、超时尝试获取锁、可以中断获取锁等,应该使用 ReentrantLock。
Step 4
Q:: ReentrantLock 提供了哪些 Synchronized 不具备的功能?
A:: ReentrantLock 提供了更高的灵活性,包括:公平锁选择、可以尝试获取锁、可以中断获取锁、可以在指定时间内尝试获取锁、Condition 机制以实现多条件等待/
通知模型。
Step 5
Q:: 什么是公平锁和非公平锁?
A:: 公平锁是指线程按照请求锁的顺序依次获得锁,防止线程饥饿。非公平锁则允许后来的线程插队,有可能使某些线程长时间无法获得锁。ReentrantLock 可以设置为公平锁或非公平锁,默认是非公平锁。