转自http://www.cnblogs.com/waterystone/p/4920797.html

几乎所有的锁都是依赖于AbstractQueuedSynchronized的,无论是独占锁还是共享锁,基本都是直接或者间接的继承AQS类。

内部结构

它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里volatile是核心关键词,具体volatile的语义,在此不述。state的访问方式有三种:

  • getState()
  • setState()
  • compareAndSetState()

设计思路

自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了。

自定义同步器实现时主要实现以下几种方法:

  • isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。
  • tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。
  • tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。
  • tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
  • tryReleaseShared(int):共享方式。尝试释放资源,成功则返回true,失败则返回false。

state参数

共享资源情况。自定义的子类需要以这个参数为判断是否获得锁的评判标准。

以ReentrantLock为例,state初始化为0,表示未锁定状态。A线程lock()时,会调用tryAcquire()独占该锁并将state+1。此后,其他线程再tryAcquire()时就会失败,直到A线程unlock()到state=0(即释放锁)为止,其它线程才有机会获取该锁。当然,释放锁之前,A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多么次,这样才能保证state是能回到零态的。

等待队列

FIFO线程等待队列采用的先进先获取的双链表结构,有头尾指针,头指针指向下一位候选的线程,尾指针方便更换最新进来的阻塞线程(采用CAS算法更换)。

获得锁的模式

一般来说,自定义同步器要么是独占方法,要么是共享方式,他们也只需实现tryAcquire-tryRelease、tryAcquireShared-tryReleaseShared中的一种即可。但AQS也支持自定义同步器同时实现独占和共享两种方式,如ReentrantReadWriteLock。

ReentrantReadWriteLock 读的时候是可以多线程共同读取,但是不允许同时读和写,也不允许多线程同时写,所以是有独占和共享两种模式。

浅谈ASQ原理学习总结相关推荐

  1. 计算机中数制教学的游戏,浅谈计算机原理中的《数制及数制转换》

    浅谈计算机原理中的<数制及数制转换> 论文联盟http:// 数制及其相互转换问题一直是学生学习过程中的难点.学生学习起来比较费力,并且不容易记住,在考试中也常常丢分,而且它也是学生进一步 ...

  2. 高中所学过的计算机知识,浅谈高中计算机学习重点论文

    21世纪是信息网络化时代,计算机技术已经成为各行各业发展的关键技术之一.作为高中学生必修的课程之一,为了适应新课改的要求,提倡在高中计算机教学中实行自主学习的教学方法.力图从自主学习模式在高中计算机教 ...

  3. 【数学教学论文】浅谈小学生数学学习兴趣的培养

    浅谈小学生数学学习兴趣的培养 作者:刘亚儒 摘要:古代教育家朱熹曾说:"教人未见其兴趣,必不乐学."由此可见,兴趣的培养在教学过程中至关重要,有利于提高数学课堂的教学效率和学生的学 ...

  4. 浅谈对SprutCAM学习认识

    SprutCAM简介 SprutCAM软件在国内被称为司普禄(我猜是音译的),是由俄罗斯开发团队研发,国内昆山司普禄科技公司代理,这个软件十分强大,可以仿真模拟市面上的绝大部分的工业机器人,相对于四大 ...

  5. Touch的秘密 浅谈触摸屏原理

    URL:http://www.idnovo.com.cn/hardware/2010/1110/article_2099.html "触摸"流行风 触摸屏为何如此流行? 其实早在1 ...

  6. 浅谈Git原理和常用命令(学习笔记)

    因为多人和做的项目经常用Git但是对于git我总是不太理解,今天熬夜学习了一下 Git我们clone下来的项目的根目录下有一个 .git 的文件,这个不是我们的工作区,它叫做版本库,它来记录我们工作区 ...

  7. 浅谈身为小白学习Linux系统的四点实用建议

    2019独角兽企业重金招聘Python工程师标准>>> 游戏.办公.安全,可以总结为是方便当代人们在生活中的刚需,我们大都是这些服务的使用者,而把单个功能整合起来那就必须谈到互联网, ...

  8. 大学c语言课程学习方法,科学网—从《C语言》浅谈大学课程学习 - 陈颖频的博文...

    经过一学期的教学,C语言已经接近尾声,希望同学们通过本课程能掌握大学课程的学习方法.园丁结合自身学习经历和项目开发经验想和各位同学谈谈,如何学好大学课程,首先,大学课程是基础中的基础,一般都会找比较经 ...

  9. 学oracle为什么,浅谈ORACLE的学习

    个人认为ORACLE的学习,就好比武侠小说中学武功.要从三方面入手: 1.内功:针以学习ORACLE来说,内功就是对基本概念的掌握,ORACLE架构的深入理解,原理的掌握.如果有兴趣和时间,研究一下I ...

最新文章

  1. 关于 TStringList.Assign - 回复 u9cm 的问题
  2. 各种登录源码来了!基础登录、验证码登录、小程序登录...全都要!
  3. Linux CentOS下配置SVN+SVN勾子
  4. Codeforces Round #409 (Div. 2)
  5. 人工智能、物联网和大数据如何拯救蜜蜂
  6. dhcp是哪一层的协议_OSI各个分层分别负责哪些功能?有哪些主要协议?涉及到哪些设备?...
  7. r语言 面板数据回归_R语言——伍德里奇计量经济导论案例实践 第十三章 横截面与面板数据(一)...
  8. IDEA中使用Maven
  9. Guice之Servlet基础
  10. pytorch学习笔记(1):开始一个简单的分类器
  11. Spring-bean的作用域(六)
  12. 【SAP解决方案干货合集】满满的干货,是您了解华为云SAP解决方案的必备利器
  13. 陆奇最新投资方向:机器人、生物科技、远程工作、云计算技术、新材料、新消费娱乐等,奇绩创坛春季创业营线上开营
  14. Unity间接光 ibl(基于图像的渲染)和SH(球谐光照)
  15. 专访马云:下一个星辰大海是百货商店
  16. 中科院博士论文致谢走红:求学22载,计算机终成一生的事业
  17. Java中,反射机制-Reflected
  18. 【文献学习】 2021 Deep-Waveform: A Learned OFDM Receiver Based on Deep Complex Convolutional Networks
  19. 实验室易发事故LS类型及防范方法
  20. (HEBUT)机械原理课程设计——自动打印机

热门文章

  1. 抖音矩阵系统源码开发技术分析
  2. profile在IT领域的profile
  3. html怎么改文字方向,WPS文字中如何更改文字方向?
  4. [已解决]Can't update: no tracked branch
  5. html p标签文字加粗_文字HTML标签
  6. mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...
  7. 九鼎传说登录服务器无响应怎么办,九鼎传说帮会系统玩法介绍
  8. SAP 物料过账 只能公司代码的期间中记账
  9. 随机分布式延迟PSO(RODDPSO)+K-Means算法(Python代码实现)
  10. NSAT-9000电池模组充放电自动测试系统