JUC之Lock vs synchronized
Lock和synchronized都能实现锁的功能,但是两者之间有着区别。
语法层面
- synchronized是关键字,源码位于jvm,用cpp实现。
- Lock是接口,源码由jdk提供,用Java语言实现。
- 使用synchronized时,退出同步代码块时,锁会自动释放;而使用Lock时,需要我们手动调用unlock方法释放锁。
功能层面
- 两者都是悲观锁,都具备基本的互斥、同步、锁重入功能。
- Lock提供了许多synchronized所不具备的功能,比如获取等待状态、公平锁、可打断、可超时、多条件变量。
- Lock有相应的方法来获取那些线程被阻塞或等待。
- Lock支持公平锁和非公平锁,synchronized只支持非公平锁。公平锁的意思是,争抢锁失败的线程在下次争抢锁时是按照先来先得的、不允许插队的,反之则为非公平锁。(但其实公平锁的吞吐量并不如非公平锁高)
- 这里可打断和可超时的意思是指,当一个线程想要获取一个锁的时候,如果锁已经被另一个线程占有了,如果我们使用的是synchronized,那么这个线程就只能一直等待同步代码块执行完毕,同步代码块中间不能被打断,等待锁的过程中没有超时时限;对于Lock锁,提供了对应的方法,比如一段时间没等到锁,就不要等下去了。
- Lock还支持多组条件变量且可以有多个等待队列;而synchronized只能支持一组条件变量,只能有一个等待队列
- Lock有适合不同场景的实现,比如ReentrantLock(可重入锁)、ReentrantTReadWriteLock(可重入读写锁,更适合读多写少的场景)。
性能层面
- 在没有竞争或竞争很少的时候,synchronized做了很多优化,如偏向锁、轻量级锁等,性能不错。
- 在竞争激烈的情况下,Lock的实现通常会提供更好的性能。
JUC之Lock vs synchronized
https://jlqusername.github.io/2025/03/30/synchronized/