Juc之ReentranLock原理

ReentrantLock简介

基本语法在这里插入图片描述

特点

  • 可重入(允许当前线程获得了该锁之后再次加锁)在这里插入图片描述

  • 可打断(当前线程如果有竞争就进入阻塞队列,可以被其他线程用interrupt方法打断等待状态此时会抛出异常)在这里插入图片描述

  • 锁超时(可以用tryLock方法加锁并且支持加等待时间超过等待时间没有得到锁返回false)在这里插入图片描述

  • 公平锁(可以在创建锁的时候设置true或false,公平锁为true默认为不公平锁,公平锁在阻塞队列中是按照进入的顺序获得锁而不是再次竞争)在这里插入图片描述

  • 条件变量ReentrantLock支持多条件变量在这里插入图片描述

与synchronized对比在这里插入图片描述

ReentrantLock原理

AQS原理

概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AQSjava中本质是一个抽象类。ReentrantLock用到了该类的对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加锁成功流程

在这里插入图片描述
Sync继承AQS是一个抽象类有两个实现类一个是NonfairSync和FairSync公平锁和非公平锁, ReentrantLock继承了Lock接口Node是AQS中的节点。
在这里插入图片描述
在这里插入图片描述
当没有竞争的时候加锁会执行以上方法秀爱state的值为1,并把当前线程设置到exclusiveOwnerThread.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获得(第一次)锁失败后再次尝试(第二次)获得锁再次失败会构造当前线程对应节点,如果处于第二个节点即头节点之后会再次(第三次)尝试获得锁,失败后然后会把前驱节点的状态改为-1表示有责任唤醒后继节点最终进入阻塞(park)在这里插入图片描述
在这里插入图片描述
释放锁的流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可重入原理

在这里插入图片描述
当前线程再次加锁会把state进行累加,释放的时候会把当前state进行减一

不可打断原理

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
不可打断模式当Thread.interruped被设置为真时会进入if把interruped设置为true知道获得锁之后返回true当前线程会被终止

可打断原理

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

当Thread.interruped被设置为真时会进入if会直接抛出异常终止不会等到获得锁之后停止

公平锁实现原理

在这里插入图片描述
在这里插入图片描述

条件变量实现原理

在这里插入图片描述
当前线程调用await会创建节点加到condition队列中并设置状态为-2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值