读写锁 ReentrantReadWriteLock第二部分

240 未经授权,禁止转载了解课程
课程介绍
讨论{{interaction.discussNum ? '(' + interaction.discussNum + ')' : ''}}
适合人群
具有JAVA和并发编程基础的同学
你将会学到
从代码层次讲解JUC高并发包及AQS框架中各个子类的实现和设计思想
课程简介

什么是AQS
   一套JAVA并发的库,位于java.util.concurent包下。
     AQS=abstractqueuedsynchronizer 翻译就是 抽象排队的同步器, 抽象是因为该类是所有该系列锁的实质实现和基础,基于抽象模板设计模式
     父类实现基础操作,子类利用该组基础API实现各种丰富的锁

具体AQS锁包括哪些
    主要包括:ReentrantLock,CyclicBa nbrrier,CountDownLatch 等,都是通过代理基于继承AQS类的子类实现。

AQS 如何实现,为什么需要AQS

    AQS是用于高并发场景,普通并发使用CAS方式就可以实现,单纯采用CAS方式的锁叫做自旋锁,自旋锁其实就是死循环,多个线程在一段死循环中尝试获取锁,
    随着并发量升高,线程个数增加,如果仍然都在死循环中竞争锁会导致CPU的浪费,常规的解决办法就是增加队列,让线程排队通过临界区,将排队的线程暂停

AQS提供两个队列  运行队列和条件队列
  运行队列是基本队列,条件队列比较灵活用于实现更加复杂的锁应用,如CyclicBarrier,CountDownLatch 等,主要用于控制基于条件变化触发线程在两个队列之间的转移。其中条件队列一般只用于存放等待信号的线程,不会被执行,事件触发后才将该队列中的节点转移到运行队列中进行执行。


ReentrantLock 包括公平锁和非公平锁两种模式,差别就在于新的到达临界区的线程第一次获取锁的时候能否不排队进行一次锁竞争,公平锁是绝对的FIFO,非公平锁的区别仅仅是第一次获取锁时候可以跳过排队环节进行一次锁获取,如果获取成功则执行临界代码,否则获取锁失败后和公平锁剩余的逻辑完全一样


ThreadLocal 类其实是个工具类,该类的对象可以通过捕获当前线程,并在线程的

nullnull


两个预留位置上放置HASHMAP 来存取或者更新一个对象,来实现将信息放置在线程对象的内部。

该类和线程是多对多的关系,多个该类的对象可以操作同一个线程的HASHMAP,每个对象也可以操作多个线程的HASHMAP,该HASHMAP通过线性探测法实现,具体信息详见第二章第1节



展开更多
发布
头像

{{ item.user.nick_name }} {{ EROLE_NAME[item.user.identity] }}

置顶笔记
讨论图
{{ item.create_time }}回复
  • 删除

    是否确认删除?

    确认
    取消
  • {{ item.is_top == 1 ? '取消置顶' : '置顶'}}

    已有置顶的讨论,是否替换已有的置顶?

    确认
    取消
{{ tag.text}}
头像
{{ subitem.user.nick_name }}{{ EROLE_NAME[subitem.user.identity] }}
{{ subitem.create_time }}回复
删除

是否确认删除?

确认
取消
发布
{{pageType === 'video' ? '讨论区抢占沙发,可获得双倍学分' :'讨论区空空如也,你来讲两句~'}}
发布
{{tips.text}}
{{ noteHeaderTitle }} 笔记{{ hasMyNote ? '我的笔记' : '记笔记' }}
{{ hasMyNote ? '我的笔记' : '记笔记' }}
优质笔记
更新于:{{ $dayjs.formate('YYYY-MM-DD HH:mm:ss', item.last_uptime*1000) }}
头像
{{ detail.username }}

公开笔记对他人可见,有机会被管理员评为“优质笔记”

{{ noteEditor.content.length }}/2000

公开笔记
保存
提问

讲师收到你的提问会尽快为你解答。若选择公开提问,可以获得更多学员的帮助。

记录时间点
记录提问时视频播放的时间点,便于后续查看
公开提问
提交