美文网首页
Java基础-线程 (五)

Java基础-线程 (五)

作者: 森屿暖茶 | 来源:发表于2021-02-01 14:51 被阅读0次

队列同步器AQS:AbstractQueuedSynchronizer )

AQS是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。

AbstractQueuedSynchronizer是一个抽象方法。AQS的使用方式是继承。子类通过实现AbstractQueuedSynchronizer的抽象方法来管理同步状态。AbstractQueuedSynchronizer中有一个volatile int state来记录代表这个同步状态。主要通过以下3个方法获取或者改变同步状态:

①getState():获取当前同步状态。

②setState(int newState):设置当前同步状态。

③compareAndSetState(int expect,int update):使用CAS设置当前状态,该方法能够保证状态设置的原子性。 

AQS使用的设计模式,模板方法设计模式。

模板方法设计模式

AQS的基本思想CLH队列锁,每一个需要拿锁的线程打包成一个节点,挂到链表上,每个线程不断自旋检测前一个节点是否释放锁,释放锁当前线程就可以拿到这把锁。

CLH队列锁是一种基于链表(双向链表)的可扩展、高性能、公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,假设发现前驱释放了锁就结束自旋。

结构:QNode,包含myPred(前驱结点)和Locked(当前是否需要获得锁,true为锁需求)。仅当myPred前驱结点值为false时。该QNode节点才能拿到锁。所以链表内的每个节点都在不断的自旋检查myPred的前驱结点Locked是否为false。

假设有A和B 2个线程。A和B分别创建2个QNode。A和B都需要拿到锁。

(1)当A拿到锁,A的myPred=true,locked=true.B的myPred=QNodeA,locked=true.

(2)B开始自旋它的前节点 locked是否为false,为false时代表A释放锁。

(3)A释放锁B拿到锁时,A的myPred=true,locked=false,B的myPred=true,locked=true.

(4)若还有C、D、E类似节点重复(1)(2)(3)。

AQS实际节点。AQS优化了CLH思想,拿不到锁的节点会自旋一定次数后就挂起节点。实际synchronized也是实现CLH队列锁的思想来实现的。区别在于AQS的的等待队列有多个,synchronized等待队列只有1个。

使用:

独占式实现以下2个方法。自行实现内容。

独占式

共享式实现以下3个方法。自行实现内容。

共享式

实现类似ReentrantLock功能(供参考,具体需求具体自行实现):

公平锁:必须按部就班的排队等待拿锁。(也称独占锁)

非公平锁:可插队拿锁,时间片轮转机制轮到谁就给谁。

相关文章

  • 多线程总结

    线程基础 线程的状态 根据java官方的定义,线程一共有五种状态NEW、RUNNABLE、BLOCKED、WAIT...

  • Java多线程目录

    一 Java并发基础介绍二 Thread类三 线程终止四 Java多线程内存模型五 volatile关键字六 sy...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • Java基础-线程 (五)

    队列同步器(AQS:AbstractQueuedSynchronizer) AQS是用来构建锁或者其他同步组件的基...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • java线程入门基础(二)

    java线程入门基础(二) 一、认识Java里的线程 1.1 Java里的程序天生就是多线程的 一个Java程序从...

网友评论

      本文标题:Java基础-线程 (五)

      本文链接:https://www.haomeiwen.com/subject/emcrnktx.html