深入理解ReetrantLock的实现原理

可重入性:
同一个线程,可以获取同一把锁多次;

ReentrantLock的可重入性:

首先ReentrantLock是基于AQS( 即AbstractQueuedSynchronizer的缩写
)实现的,ReetrantLock继承自Lock,有三个内部类(sync、fairSync、nonfairSync),其中sync继承自AbstractQueuedSynchronizer,另外俩个内部类继承自sync;
通过Sync重写的方法tryAcquire、tryRelease可以知道,ReentrantLock实现的是AQS的独占模式,也就是独占锁,这个锁是悲观锁。
ReentrantLock有俩个构造函数,可以用来针对性构建 公平锁和非公平锁;
公平锁和非公平锁 的实现原理 实现的区别主要体现在 获取锁的时候:
(1) 公平锁获取锁的时候,
会先判断state是不是等于0,
如果等于0,则表示该线程没有被占用,然后再去判断同步队列中有没有等待队列,如果有的话,则将当前线程放入等待队列的队尾; 如果队列为空,则将该线程设置为锁的所有者 ,使用CAS修改states,返回true.
如果不等于0,则去判断该锁的所有者是不是当前线程(Thread.currentThread()), 如果是的话,则将states+1, 返回true;否则返回false;
(2) 非公平锁获取锁时:
通过getState的方法获取state的值,如果值为0,则使用CAS设置states的值,且直接将该锁的所有者设置为当前线程,如果设置成功,则返回true;
如果states不为0,则去判断当前锁的拥有者是不是自己,如果是自己的话,则state+1,返回true;如果不是自己的话,则返回false,放入同步队列中等待锁的释放;

ReentrantLock的实现包含公平锁和非公平锁, 是悲观锁, 也是可重入锁,这里的可重入就体现在获取锁的时候,对state的操作;

源码分析看一下,下面这篇文章:
附:一篇结合源码讲的很到位的网址:点击查看

锁的可重入性,我们可以讨论两类锁:
一个是上面讲的ReetrantLock,一个是Synchronized(内置锁);

那么Synchronized的可重入性 原理是什么呢?

每一个锁会关联一个 线程持有者 和 一个 计数器.当计数器是0的时候,表示该锁没有被占用,可以直接获取锁;如果持有锁的线程再一次来请求获取锁,则可以获取到锁,并且计数器➕1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值