同步锁/线程安全 | ReentrantLock与synchronized的区别

ReentrantLock 有如下特点:

1. 可重入

ReentrantLock syncronized 关键字一样,都是可重入锁,不过两者实现原理稍有差
别, RetrantLock 利用 AQS 的的 state 状态来判断资源是否已锁,同一线程重入加锁,
state 的状态 +1 ; 同一线程重入解锁 , state 状态 -1 ( 解锁必须为当前独占线程,否则异
); state 0 时解锁成功。

2. 需要手动加锁、解锁

synchronized 关键字是自动进行加锁、解锁的,而 ReentrantLock 需要 lock()
unlock() 方法配合 try/finally 语句块来完成,来手动加锁、解锁。

3. 支持设置锁的超时时间

synchronized 关键字无法设置锁的超时时间,如果一个获得锁的线程内部发生死锁,那
么其他线程就会一直进入阻塞状态,而 ReentrantLock 提供 tryLock 方法,允许设置线
程获取锁的超时时间,如果超时,则跳过,不进行任何操作,避免死锁的发生。

4. 支持公平/非公平锁

synchronized 关键字是一种非公平锁,先抢到锁的线程先执行。而 ReentrantLock
构造方法中允许设置 true/false 来实现公平、非公平锁,如果设置为 true ,则线程获取
锁要遵循 " 先来后到 " 的规则,每次都会构造一个线程 Node ,然后到双向链表的 "
" 后面排队,等待前面的 Node 释放锁资源。

5. 可中断锁

ReentrantLock 中的 lockInterruptibly() 方法使得线程可以在被阻塞时响应中断,比
如一个线程 t1 通过 lockInterruptibly() 方法获取到一个可重入锁,并执行一个长时间
的任务,另一个线程通过 interrupt() 方法就可以立刻打断 t1 线程的执行,来获取 t1
有的那个可重入锁。而通过 ReentrantLock lock() 方法或者 Synchronized 持有锁
的线程是不会响应其他线程的 interrupt() 方法的,直到该方法主动释放锁之后才会响应
interrupt() 方法。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学的小Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值