synchronized 与ReentrantLock区别?
时间: 2023-05-26 14:01:44 浏览: 119
第15讲synchronized和ReentrantL1
synchronized 和 ReentrantLock 都是用于实现线程同步的方法。它们的主要区别如下:
1. 锁的获取方式不同
synchronized 是隐式锁,当一个线程进入 synchronized 代码块时,会自动获取锁;当代码块执行完毕时,会自动释放锁。
ReentrantLock 是显式锁,需要在代码中通过 lock() 方法显式获取锁,在代码执行完成之后要使用 unlock() 方法释放锁。
2. 可中断性
synchronized 不支持中断,当一个线程 A 持有锁,另一个线程 B 想要获取锁但无法获取时,B 只能一直等待直到 A 释放锁。
ReentrantLock 支持中断,当一个线程 A 持有锁,另一个线程 B 想要获取锁但无法获取时,B 可以调用 lockInterruptibly() 方法中断 A 的等待状态。
3. 公平性
synchronized 不保证公平性,即不保证等待时间最长的线程最先获取锁。
ReentrantLock 可以通过构造函数选择公平性,通过公平锁的方式可以保证等待时间最长的线程最先获取锁。
4. 灵活性
ReentrantLock 有更强的灵活性,比如支持在锁内部的分别获取和释放锁。
总的来说,如果只是简单的需要实现线程同步,使用 synchronized 是更为简单方便的;如果需要更灵活的控制和更高级的特性,ReentrantLock 就比较合适。
阅读全文