ReentrantLock解析

本文详细解析了ReentrantLock的概念,包括其基本知识、重要方法如lock(), lockInterruptibly(), tryLock()等,以及与synchronized关键字的区别。通过示例展示了如何使用ReentrantLock进行线程同步,并解释了其作为重入锁的特性。

1.基本知识

在了解ReentrantLock之前,我们必须要了解可重入锁的概念
顾名思义
Re-entrant-Lock 代表可以重复进入的锁,但是仅仅限于当前线程

2.重入锁的重要方法

1)lock()

获取锁,有以下三种情况

  • 锁空闲:直接获取锁并返回,同时设置锁持有者数量为:1
  • 当前线程持有锁:直接获取锁并返回,同时锁持有者数量递增1
  • 其他线程持有:当前线程会休眠等待,直至获取锁为止

2)lockInterruptibly()

获取锁,逻辑和lock()方法一样,但这个方法在获取锁过程中能响应中断

3)tryLock()

字面理解,尝试获取锁,获取成功返回:true,获取失败返回:false,这个方法不会等待,有以下三种情况

  • 锁空闲:直接获取锁并返回:true,同时设置锁持有者数量为1
  • 当前线程持有锁:直接获取锁并返回:true,同时锁持有者数量递增1
  • 其他线程持有锁:获取锁失败,返回:false

4)tryLock(long timeout,TimeUnit unit)

逻辑和tryLock()差不多,只是这个方法是带时间的

5)unlock()

释放锁,每次锁持有者数量递减1,直到0为止。所以,现在直到为什么lock多少次,就要unlock多少次了

6)newCondition

返回一个这个锁的Condition实例,可以实现synchronized关键字类似wait/notify 实现多线程通信功能,不过这个比 wait/notify要更灵活,更强大!

3.重入锁的大概用法

下面展示一些 内联代码片

class X {

  private final ReentrantLock lock = new ReentrantLock();

  // ...

  public void m() {
    lock.lock();  // block until condition holds
    try {
      // ... method body
    } finally {
      lock.unlock()
    }
  }

}}

看见没有,加锁和释放锁都在方法里面进行,可以自由控制,比 synchronized 更灵活,更方便。但要注意的是,释放锁操作必须在 finally 里面,不然如果出现异常导致锁不能被正常释放,进而会卡死后续所有访问该锁的线程。

4.synchronized是重入锁吗

synchronized是重入锁

public synchronized void operation(){
    add();
}

public synchronized void add(){

}

operation 方法调用了 add 方法,两个方法都是用 synchronized 修饰的,add() 方法可以成功获取当前线程 operation() 方法已经获取到的锁,说明 synchronized 就是可重入锁。

总结

其实重入锁就是一种颗粒度更小的锁,控制更方便,更强大,栈长只是简单介绍一下重入锁的基本概念及用法,但远不止这么简单,还有很多,一篇也难也详尽,够写好多篇了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值