AbstractQueuedSynchronizer是一个抽象同步队列器,它的作用是提供一个框架,简化程序员对锁,同步控制工具的开发。如果从零开发一个可重入的独占锁,程序员至少需要做以下的处理,先尝试获取锁,如果获取锁失败,则线程进入阻塞,等待“释放锁线程”唤醒,而有了AQS,程序员只需要继承AQS类,实现“尝试获取锁”方法,实现"尝试释放锁",就可以轻松实现可重入独占锁了。

如下代码所示,定义一个Sync的内部类,继承了AbstractQueuedSynchronizer,实现了tryAcquire跟tryRelease方法,tryAcquire是尝试获取锁方法,tryRelease是尝试释放锁方法,通过AbstractQueuedSynchronizer定义的state变量,来定义当前锁的状态,下面的锁state>0表示已经有线程占有锁,以及占有锁线程的重入次数。

public class MyReentrantLock implements Lock {private Sync sync=new Sync();@Overridepublic void lock() {sync.acquire(1);}@Overridepublic void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Overridepublic boolean tryLock() {return sync.tryAcquire(1);}@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1,time);}@Overridepublic void unlock() {sync.release(1);}@Overridepublic Condition newCondition() {return sync.newCondition();}/*** 继承AbstractQueuedSynchronizer,重写tryAcquire,tryRelease方法.就可以实现可重入独占锁。*/public class Sync extends AbstractQueuedSynchronizer{/*** 尝试获取锁逻辑* @param arg* @return*/@Overrideprotected boolean tryAcquire(int arg) {if(compareAndSetState(0,1)){setExclusiveOwnerThread(Thread.currentThread());return true;}if(getExclusiveOwnerThread()==Thread.currentThread()){setState(getState()+1);return true;}return false;}/***尝试释放所* @param arg* @return*/@Overrideprotected boolean tryRelease(int arg) {if(getExclusiveOwnerThread()!=Thread.currentThread()){throw new RuntimeException();}int state = getState() - 1;//减少可重入次数if(state>0){setState(state);return false;}//释放锁setState(state);setExclusiveOwnerThread(null);return true;}//Condition newCondition() { return new ConditionObject(); }}
}
AbstractQueuedSynchronizer的作用远不止如此,还可以通过它实现共享锁,读写锁,同步控制工具等。
补充:
通过选择性重写这五个方法,结合state变量,可以实现共享锁,读写锁,同步控制工具等,这些源码会在后面博客进行说明。
* <li> {@link #tryAcquire}
* <li> {@link #tryRelease}
* <li> {@link #tryAcquireShared}
* <li> {@link #tryReleaseShared}
* <li> {@link #isHeldExclusively}

AbstractQueuedSynchronizer简单理解及介绍相关推荐

  1. 互联网协议-简单理解和介绍

    概念:互联网实现过程中大家都需要遵循的准则,我们称之为协议. 前提概要: 我们知道当我们访问互联网是,是在浏览器的导航栏输入一个网址,http://www.baidu.com/ 而一个网址对应的是一个 ...

  2. 一名菜鸟程序猿对前端的简单理解及介绍

    目录 前言 一.做前端要用到哪些技术? 1.HTML 2.CSS 3.JavaScript 二.一些其他的工具或技术 1.PhotoShop 2.Postman 3.Visual Studio Cod ...

  3. 红黑树(Red Black Tree)的简单理解

    红黑树(Red Black Tree)的简单理解 前言介绍 AVL树的简单介绍 为什么需要AVL树? AVL树的调整过程 AVL树的缺点 红黑树与AVL相比 234树的简单介绍 234树的概念 234 ...

  4. Java:java学习笔记之锁机制的简单理解和使用

    锁机制的简单理解和使用 锁机制 1.背景 2.定义 3.锁的种类 4.乐观锁 VS 悲观锁 4.1.悲观锁 4.2.乐观锁 4.3.举例说明 4.4.CAS算法 4.4.1.CAS使用 4.4.2.C ...

  5. 【转载】Deep learning:十九(RBM简单理解)

    Deep learning:十九(RBM简单理解) 这篇博客主要用来简单介绍下RBM网络,因为deep learning中的一个重要网络结构DBN就可以由RBM网络叠加而成,所以对RBM的理解有利于我 ...

  6. 入门启发:音视频的简单理解

    算机技术领域中,『音视频技术』应该说算是较复杂的小门类.较复杂的东西有个简单的入门指引,或者有前辈带路是很重要的. 前阵子,因为项目中急需音视频技术,虽然网上资料看似很丰富,但对初学者来说,很多资料都 ...

  7. 《论可计算数及其在判定上的应用》简单理解

    刚刚拜读了一本书, <图灵的秘密>. 该书介绍了图灵的论文<论可计算数及其在判定上的应用>, 其指出: 一个拥有铅笔, 纸和一串明确指令的人类计算者, 可以被看做是一种图灵机. ...

  8. 关于C语言函数的简单理解

    关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...

  9. CPD配准算法及代码的简单理解(Coherent Point Drift)

    我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...

  10. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

最新文章

  1. 为什么 C+标准每三年发布一次?
  2. 探索 OSGi 框架的组件运行机制
  3. 如何防止用户重复提交表单
  4. 【BZOJ3566】—概率充电器(树形+概率dp)
  5. STM32板子电源绘制原理
  6. python编程总结
  7. 投资人常用的忽悠用语!
  8. 使用Sophix热修复注意事项
  9. 手游封包辅助开发教程
  10. 固态U盘能装linux么,用u盘在固态硬盘上安装linux 多重开启系统
  11. 那些普通人的价值观终究会害了你
  12. python爬取招聘网站视频教程_Python爬取拉钩招聘网
  13. 商用咖啡机 推荐.html,商用咖啡机推荐,半自动咖啡机如何使用?
  14. 灵活高效PDF转Word工具
  15. jupyter notebook  安装nbextension 不显示插件怎么办?
  16. matlab仿真高尔顿正态分布源码,中心极限定理:从高尔顿板到麦克斯韦分布
  17. RequireJS - 简介
  18. 【游戏开发阅读列表2】动画(Anima2D、粒子、物理等)
  19. unity接入微信支付完成切换前台游戏闪退
  20. 苹果 macOS 13 开发者预览版 Beta 11(内部版本号:22A5373b)发布

热门文章

  1. Java Swing事件处理——行为事件及监听处理 ActionListener和内部类
  2. 衡算计算机性能指标,广东海洋大学2018年硕士生招生初试科目的考试内容范围说明计算机.PDF...
  3. pypi.python.org_https://pypi.python.org/pypi/ssh
  4. 谷歌放弃go_用 Go 实现 Flutter
  5. 服务器webpack构建性能,webpack构建和性能优化探索
  6. 两台服务器安装redis集群_高性能分布式存储服务Minio安装配置入门
  7. html表单提交数据保存到mysql中_php – Canonical:如何将HTML表单数据保存到MySQL数据库中...
  8. java调用一个外部url_java 从程序内部调用外部url/接口
  9. STM32——库函数版——矩阵按键程序
  10. deeplin显示安装空间不够_太实用了!这种冷门的显示器支架可帮了大忙了