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/
作者
B907
发布于
2025年3月30日
许可协议