synchronized 和 ReentrantLock/Lock 的区别

1、底层结构不同

synchronized 是关键字,由JVM底层实现。(底层是通过monitor对象来完成:monitorenter/monitorexit)
lock 是具体的接口(java.util.concurrent.locks.lock),是API层面的锁。

2、使用方法

synchronized 不需要手动释放锁,代码执行完后,系统会自动释放线程占有的锁。
ReentrantLock 需要手动释放锁,若没有主动释放,可能会导致死锁。
需要lock()、unlock() 配合try/finally语句块来使用。

3、等待是否可中断

synchronized 不可中断,除非抛出异常或代码正常运行完成。
ReentrantLock 可中断。
(1)设置超时方法tryLock(long timeout, TimeUnit unit)
(2) lockInterruptibly() 放代码块中,调用 interrupt()方法可中断。

4、加锁是否公平

synchronized 是非公平锁。
ReentrantLock 两者都可。默认是非公平锁。不过可通过构造方法传入true创建公平锁;false非公平锁。

5、锁是否可以绑定多个条件Condition

synchronized 没有。
ReentrantLock 可以分组唤醒需要唤醒的线程,可以精确唤醒。而不是像synchronized要么随机唤醒一个线程,要么唤醒全部线程。

引申:

普通版:加锁--等待--唤醒
synchronized、wait()、notify()。
升级版:加锁--等待--唤醒
ReentrantLock、await()(先lock.newCondition()得到Condition)、signal()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值