java多线程学习笔记 --五.AQS

J.U.C - AQS AbstractQueuedSynchronizer

AQS简介

AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向列表

在这里插入图片描述

  • Sync queue:同步队列,是一个双向列表。包括head节点和tail节点。head节点主要用作后续的调度。
  • Condition queue:非必须,单向列表。当程序中存在cindition的时候才会存在此列表

AQS设计思想

  • 使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架。
  • 利用int类型标识状态。在AQS类中有一个叫做state的成员变量
  • 基于AQS有一个同步组件,叫做ReentrantLock。在这个组件里,stste表示获取锁的线程数,假如state=0,表示还没有线程获取锁,1表示有线程获取了锁。大于1表示重入锁的数量。
  • 继承:子类通过继承并通过实现它的方法管理其状态(acquire和release方法操纵状态)。
  • 可以同时实现排它锁和共享锁模式(独占、共享),站在一个使用者的角度,AQS的功能主要分为两类:独占和共享。它的所有子类中,要么实现并使用了它的独占功能的api,要么使用了共享锁的功能,而不会同时使用两套api,即便是最有名的子类ReentrantReadWriteLock也是通过两个内部类读锁和写锁分别实现了两套api来实现得

AQS同步组件

  • CountDownLatch
  • Semaphore
  • CyclicBarrier
  • ReentrantLock
  • Condition
  • FutureTask

CountDownLatch

在这里插入图片描述

通过一个计数来保证线程是否需要被阻塞。实现一个或多个线程等待其他线程执行的场景。

需要完成某个任务后,在开始一个新任务

具体见代码

Semaphore

  • 可用于控制并发访问线程数
  • 轻松完成os中的操作
  • Semaphore使用acquire方法和release方法来实现控制
  • 在数据结构中我们学过链表,链表正常是可以保存无限个节点的,而Semaphore可以实现有限大小的列表

使用场景:控制并发数,常用于仅能提供有限资源

具体见代码演示

CyclicBarrier

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IygRngs-1585051866270)(F:\gupao\多线程\w4.png)]

也是一个同步辅助类,它允许一组线程相互等待,直到到达某个公共的屏障点(循环屏障)

多个线程之间相互等待,只有每个线程都准备就绪后才能继续往下执行后面的操作

每当有一个线程执行了await方法,计数器就会执行+1操作,待计数器达到预定的值,所有的线程再同时继续执行。由于计数器释放之后可以重用(reset方法),所以称之为循环屏障

  • 与CountDownLatch区别:
    1、计数器可重复用
    2、描述一个或多个线程等待其他线程的关系/多个线程相互等待

ReentrantLock与锁

ReentrantLock和synchronized区别

  • 都是可重入锁
  • 锁的实现 synchronized是基于JVM的 ReentrantLock是基于JDK了
  • 性能的区别
    • 在synchronized优化前,Reentrantlock性能更好,自从synchronized优化后,官方建议使用synchronized,在用户态解决问题,防止os切到内核态
    • synchronized优化借鉴了RenntrantLock的CAS技术,采用了偏向锁,轻量级锁的自旋锁
  • 功能区别
    • 便利性 synchronized 不需要手工
    • 锁的细粒度和灵活性
  • reentrantLock独有的功能
    • 可指定是公平锁还是非公平锁
    • 提供一个condition类,可以分组唤醒需要唤醒的线程
    • 提供能够中断等待锁的线程机制,lock.lockInterruptibly()

ReentrantReadWriteLock

核心要求:在没有任何读写锁的情况下 才可以取得写入锁

主要可以用于实现悲观读取。

如果读取多写少,使用这个类,可能会使写线程饥饿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值