ReentrantLock非公平锁实现原理解读

本文介绍了ReentrantLock的非公平锁实现原理。ReentrantLock默认为非公平锁,它允许线程不按顺序获取锁,提高CPU利用率。在尝试加锁失败后,线程会被加入等待队列并进行阻塞,直到被唤醒再次尝试获取锁。通过分析源码,详细阐述了非公平锁的加锁过程,包括尝试CAS修改State、线程加入等待队列及节点状态管理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

        ReentrantLock基于AQS,在并发编程中可以实现公平锁和非公平锁来对共享资源进行同步,同时和synchronized一样,支持锁重入,除此之外,RenentrantLock更加灵活,支持实现更多丰富的功能。说到ReentrantLock根据它的中文名,翻译过来叫做,可重入锁。但是仅仅用可重入一个特性来描述ReentrantLock好像有点以偏概全,其公平锁,非公平锁的实现,以及condition的实现似乎都很重要。所以这也是编程人员命名的一个烦恼。

        基于上面的概述,我们不难得出,ReentrantLock有四个比较重要的特性,公平与非公平加锁的实现,解锁的实现,条件变量的实现。下面就通过一些流程图以及源码的描述对这几个特性做细致的讲解。

非公平锁的实现

        非公平锁,直接从它的字面意思理解,不公平的锁。ReentrantLock默认初始化就是非公平锁。非公平锁的意思就是一个线程可以不排队就直接去获得锁。

  基于常识,如果一个银行窗口正在处理业务,人们公平地去排队,依次处理业务,与人们哄抢着占用窗口处理业务,我们会觉得公平地有秩序地去处理业务会更加节约时间。但是在计算机领域却不是这样的,当线程进入等待队列去排队的时候,如果要唤醒一个等待队列中的线程,让他来获得锁,那么将会需要一段CPU消耗时间来重新唤醒这个线程也就是要实现一次上下文切换,比起直接让另外一个线程获得这个锁,可以节省一些时间,从而让CPU利用率更高。

        下面就通过一个例子,结合源码讲一下非公平锁加锁过程。例子是当前已经有一个线程获得了锁,此时,另外一个线程尝试去获得

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值