Java 并发面试题, Java 的 synchronized 是怎么实现的?
Java 并发面试题, Java 的 synchronized 是怎么实现的?
QA
Step 1
Q:: Java 的 synchronized 是怎么实现的?
A:: Java 的 synchronized 关键字用于实现线程同步,它通过一种内置的锁机制来确保同一时刻只有一个线程可以执行被 synchronized 修饰的方法或代码块。当一个线程进入 synchronized 方法或代码块时,它会自动获得该对象的锁,其他线程需要等待这个线程释放锁后才能进入。synchronized 的底层实现依赖于 JVM 内置的监视器锁(monitor lock)和对象头(object header)的 Mark Word 进行状态管理。
Step 2
Q:: synchronized 和 ReentrantLock 有什么区别?
A:: synchronized 是 Java 提供的关键字,通过 JVM 实现的同步机制,而 ReentrantLock 是 Java.util.concurrent.locks 包下的一个类,提供了更灵活的锁机制。主要区别包括:1. synchronized 是隐式锁,获取和释放锁是隐式的,而 ReentrantLock 需要显式地获取和释放锁;2. ReentrantLock 提供了更高级的功能,如定时锁等待、可中断锁等待、公平锁等;3.
性能方面,ReentrantLock 在高竞争环境下可能更优。
Step 3
Q:: synchronized 的锁对象是什么?
A:: synchronized 的锁对象可以是任何一个 Java 对象。当使用 synchronized 方法时,锁对象是当前实例对象(this);当使用静态 synchronized 方法时,锁对象是当前类的 Class 对象;当使用 synchronized 块时,锁对象是括号内指定的对象。
Step 4
Q:: 如何避免死锁?
A:: 避免死锁的方法包括:1. 尽量减少锁的持有时间;2. 尽量减少锁的粒度(尽量使用细粒度的锁);3. 尽量减少锁的数量;4. 对多个锁的获取顺序进行规定,避免交叉锁定;5.
使用超时机制,如 tryLock 方法,可以指定等待时间,如果在指定时间内没有获得锁,则返回 false,从而避免死锁。