ReentrantLock与synchronized对比
请多方面对比ReentrantLock和synchronized的区别,包括公平性、可中断性、超时机制、条件变量、性能等。
回答
古法程序员
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 公平性 | 非公平 | 可选公平/非公平(构造参数) |
| 可中断 | 不支持,等待锁时不可中断 | lockInterruptibly()支持中断 |
| 超时 | 不支持 | tryLock(timeout, unit) |
| 条件变量 | 每个Object一个wait set,notify随机唤醒 | 多个Condition,signal可指定唤醒 |
| 灵活性 | 自动释放(块结束或异常) | 需finally中unlock() |
| 锁检测 | 不支持 | tryLock()可检测是否获取锁 |
| 底层 | JVM内置(C++实现) | Java API(基于AQS) |
| 性能 | JDK6后优化(锁升级),与ReentrantLock接近 | 复杂场景下更灵活 |
选择建议:简单同步用synchronized(代码简洁、不易出错);需要超时、可中断、多条件变量时用ReentrantLock。