聊聊高并发(十六)实现一个简单的可重入锁

本文探讨了可重入锁的概念,解释了为何在Java中使用synchronized关键字实现的内置锁是可重入的,并通过一个简单的实现示例展示了可重入锁的工作原理,包括计数器、内部锁和条件队列等关键机制。
摘要由CSDN通过智能技术生成

可重入锁指的是如果一个线程已经获得了一个锁,那么它可以多次进入这个锁,当然前提是线程需要先获得这个锁。

可重入锁是最常使用的锁,Java的内置锁就是可重入锁,使用synchronized关键字可以启用内置锁机制,比如说一个类有两个synchronized方法A和B,在A方法中调用了B方法,如果锁不是可重入的,那么访问B时需要再次竞争锁,这样会带来死锁。

        public synchronized void A(){
		B();
	}
	
	public synchronized void B(){
		
	}


可重入锁解决了这个问题,它使用一个计数器来记录一个线程进入锁的次数,每次进入锁计数器就加1,释放锁减1,直到计数器为0时表示真正释放了锁。其他锁看到计数器不为0时就知道有其他线程已经获得了锁,就需要等待。Java的内置锁的基本原理也是这样,JDK1.5之后提供了显式锁ReentrantLock也是这个基本原理。


下面实现一个简单的可重入锁,

1. 使用一个Thread引用指向获得锁的线程

2. 使用一个计数器记录一个线程进入锁的次数,当计数器为0时表示锁是空闲的

3. 使用一个内部锁Lock来同步线程

4. 使用一个isHoldZero的条件来进行条件队列操作

5. 当获得锁的线程是自己时,只修改计数器的值,直接获得锁

6. 当获得锁的线程不是自己时,需要在holdCount !=0 这个条件谓词上等待,直到计数器归0,再次竞争锁

7. 释放锁时计数器减1

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值