java并发包之AbstractQueuedSynchronizer源码分析

分析并发包首先要了解AbstractQueuedSynchronizer(AQS),因为AQS是并发包的基础工具类。本文从ReentrantLock的公平锁出发,分析AbstractQueuedSynchronizer的工作过程。

lock与unlock的使用:
两个线程同时对一个变量i进行加一操作。lock.lock()确保同一时间只有一个线程进行。输出结果为200000。
AQS结构
分析源码首先要分析其结构,下面为AQS抽象类中的属性:

所以AQS的阻塞队列如下图所示.

其实就是一个FIFO队列,公平锁就是每次抢占锁时需要判断队列中是否有其他比我更早等待的,谁先在队列中谁先拿到锁。
阻塞队列中每个线程被实例成一个节点,每个节点属性如下:

上面为基础知识,需要在心里一直有这么个结构,后面会多次涉及。下面开始分析ReentrantLock的公平锁。
ReentrantLock在内部使用内部类Sync来管理锁,所以真正获取和释放锁由内部类Sync来控制
Sync由 NonfairSync(非公平锁)和 FairSync(公平锁)实现

接下来就是解锁操作与解锁操作,由于自己这里掌握不是很好先省略这一部分。

线程唤醒以后,回到前面方法:

到这里的加锁和释放锁的操作就结束了。

java并发包源码分析相关推荐

  1. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  2. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  3. java.util.ServiceLoader源码分析

    java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...

  4. 并发编程5:Java 阻塞队列源码分析(下)

    上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  5. Java并发包源码学习系列:同步组件CountDownLatch源码解析

    文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...

  6. Java并发-ReentrantReadWriteLock源码分析

    ReentrantLock实现了标准的互斥重入锁,任一时刻只有一个线程能获得锁.考虑这样一个场景:大部分时间都是读操作,写操作很少发生:我们知道,读操作是不会修改共享数据的,如果实现互斥锁,那么即使都 ...

  7. suricata中DPDK收发包源码分析2

    <suricata中DPDK收发包源码分析1>中分析了整体的DPDK收发包框架代码,今天我们继续来深入了解一下一些细节方面的问题. 目录 Q1:收发包线程模式在代码中是怎样确定的? Q2: ...

  8. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  9. Java并发包源码学习系列:AbstractQueuedSynchronizer

    文章目录 本篇学习目标 AQS概述 AbstractOwnableSynchronizer 同步队列与Node节点 同步状态state 重要方法分析 独占式获取与释放同步状态 共享式获取与释放同步状态 ...

  10. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

最新文章

  1. hdu2896 病毒侵袭 ac自动机
  2. 叉叉助手停运有什么替代的_亚马逊全球开店助手将停止服务!卖家:终究是错付了...
  3. xampp for mac mysql_xampp for mac下载-Xampp Mac版下载 V7.3.2-PC6苹果网
  4. 在spring中使用JdbcTemplate进行数据库管理操作
  5. C# Socket简单例子(服务器与客户端通信)
  6. verilog之用户定义原语UDP详细解释
  7. 在java中关于封装性的说法中错误的是_java题库2
  8. qt linux 网络聊天室,QT tcp网络聊天室群聊的实现
  9. 好儿优机器人_好儿优机器人app
  10. git官网下载太慢解决方法
  11. 自己动手编写CSDN博客备份工具-blogspider之源码分析(2)
  12. 讯飞 AIUI 集成
  13. 万维钢:怎样做读书笔记
  14. 传统行业+互联网思维
  15. python中的if判断,和while循环的用法
  16. web文件上传-0x00漏洞
  17. canvas如何绘制虚线
  18. docker 安装clickhouse(springboot mybatisplus clickhouse 整合)
  19. java 图片 缩略图_java 图片缩略图的两种方法
  20. 让数据起飞,MySql索引

热门文章

  1. c int转字符串_零基础如何学好Python 之int 数字整型类型 定义int()范围大小转换...
  2. sudo: vim:找不到命令_linux常用命令(3)
  3. vue 获取本地的json文件内容
  4. QT造类器(操作简单)
  5. 10款功能强大的网络嗅探工具应用分析
  6. 修改SAP下载文件路径
  7. csdn下载频道资源整理
  8. java小游戏制作(maxfo)
  9. 警告!不要购买安桥Htx22hdx直到你读这
  10. 安装SQL2005出现服务器启动失败或者安装后启动服务器失败的原因及解决方法