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