Skip to content

synchronized 和 ReentrantLock的区别

cxuan edited this page Sep 20, 2020 · 2 revisions
  1. 从用法角度看:synchronized 属于 Java 的关键字,是 JVM 实现的一种同步机制,不对外提供 API,进入 synchronized 关键字的方法或代码块就会请求对应对象的锁,且在请求锁的过程中如果线程被中断是不可响应的;而 ReentrantLock 属于 Java 提供的一种锁机制,提供大量的 API 进行调用,且在请求等待锁时线程可以响应中断。

  2. 从实现角度看,synchronized 是非公平锁,而 ReentrantLock 额外增加了公平锁的实现方式,在构造方法中可以传入 true 或 false 指定是否使用公平锁;synchronized 在 JDK1.6 时做了很多优化,存在锁升级的过程,而 ReentrantLock 没有锁升级的过程,获取锁时通过 CAS 设置内部 state 状态。ReentrantLock 和 synchronized 都可以实现等待/通知机制,但ReentrantLock 可以实现选择性通知,在同一个锁上可以绑定多个条件等待队列 Condition,而 synchronized 没有这种机制,可以看作是只提供了一个等待队列

Clone this wiki locally