Sychronized和ReentrantLock的区别
Sychronized和ReentrantLock都是实现线程同步的机制,都是可重入锁,只是使用场景不同。
区别
语法层面:
synchronized
是关键字,自动加锁释放锁;而ReentrantLock
是一个类,需要手动加锁和释放。功能特性:这是核心区别。
ReentrantLock
功能更丰富,它支持公平锁、可中断的锁等待、尝试获取锁以及绑定多个条件变量,而synchronized
不支持这些功能。性能:在 Java 6 之后,两者性能差距不大,性能不应作为主要选型依据。
如何选择?(面试加分项)
优先考虑
synchronized
:对于 大多数标准的同步需求。
理由:代码简洁,不易出错(自动释放锁),且性能不差。这是《Effective Java》中推荐的做法。
只有在需要
ReentrantLock
提供的高级功能时,才使用它:需要 可中断的锁等待。
需要 尝试获取锁(避免死锁)。
需要 公平锁。
需要 复杂的、分组唤醒线程的同步场景(如“生产者-消费者”模型中的多个等待条件)