AbstractQueuedSynchronizer简单理解及介绍
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简单理解及介绍相关推荐
- 互联网协议-简单理解和介绍
概念:互联网实现过程中大家都需要遵循的准则,我们称之为协议. 前提概要: 我们知道当我们访问互联网是,是在浏览器的导航栏输入一个网址,http://www.baidu.com/ 而一个网址对应的是一个 ...
- 一名菜鸟程序猿对前端的简单理解及介绍
目录 前言 一.做前端要用到哪些技术? 1.HTML 2.CSS 3.JavaScript 二.一些其他的工具或技术 1.PhotoShop 2.Postman 3.Visual Studio Cod ...
- 红黑树(Red Black Tree)的简单理解
红黑树(Red Black Tree)的简单理解 前言介绍 AVL树的简单介绍 为什么需要AVL树? AVL树的调整过程 AVL树的缺点 红黑树与AVL相比 234树的简单介绍 234树的概念 234 ...
- Java:java学习笔记之锁机制的简单理解和使用
锁机制的简单理解和使用 锁机制 1.背景 2.定义 3.锁的种类 4.乐观锁 VS 悲观锁 4.1.悲观锁 4.2.乐观锁 4.3.举例说明 4.4.CAS算法 4.4.1.CAS使用 4.4.2.C ...
- 【转载】Deep learning:十九(RBM简单理解)
Deep learning:十九(RBM简单理解) 这篇博客主要用来简单介绍下RBM网络,因为deep learning中的一个重要网络结构DBN就可以由RBM网络叠加而成,所以对RBM的理解有利于我 ...
- 入门启发:音视频的简单理解
算机技术领域中,『音视频技术』应该说算是较复杂的小门类.较复杂的东西有个简单的入门指引,或者有前辈带路是很重要的. 前阵子,因为项目中急需音视频技术,虽然网上资料看似很丰富,但对初学者来说,很多资料都 ...
- 《论可计算数及其在判定上的应用》简单理解
刚刚拜读了一本书, <图灵的秘密>. 该书介绍了图灵的论文<论可计算数及其在判定上的应用>, 其指出: 一个拥有铅笔, 纸和一串明确指令的人类计算者, 可以被看做是一种图灵机. ...
- 关于C语言函数的简单理解
关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...
- CPD配准算法及代码的简单理解(Coherent Point Drift)
我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...
- 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)
深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...
最新文章
- 为什么 C+标准每三年发布一次?
- 探索 OSGi 框架的组件运行机制
- 如何防止用户重复提交表单
- 【BZOJ3566】—概率充电器(树形+概率dp)
- STM32板子电源绘制原理
- python编程总结
- 投资人常用的忽悠用语!
- 使用Sophix热修复注意事项
- 手游封包辅助开发教程
- 固态U盘能装linux么,用u盘在固态硬盘上安装linux 多重开启系统
- 那些普通人的价值观终究会害了你
- python爬取招聘网站视频教程_Python爬取拉钩招聘网
- 商用咖啡机 推荐.html,商用咖啡机推荐,半自动咖啡机如何使用?
- 灵活高效PDF转Word工具
- jupyter notebook 安装nbextension 不显示插件怎么办?
- matlab仿真高尔顿正态分布源码,中心极限定理:从高尔顿板到麦克斯韦分布
- RequireJS - 简介
- 【游戏开发阅读列表2】动画(Anima2D、粒子、物理等)
- unity接入微信支付完成切换前台游戏闪退
- 苹果 macOS 13 开发者预览版 Beta 11(内部版本号:22A5373b)发布
热门文章
- Java Swing事件处理——行为事件及监听处理 ActionListener和内部类
- 衡算计算机性能指标,广东海洋大学2018年硕士生招生初试科目的考试内容范围说明计算机.PDF...
- pypi.python.org_https://pypi.python.org/pypi/ssh
- 谷歌放弃go_用 Go 实现 Flutter
- 服务器webpack构建性能,webpack构建和性能优化探索
- 两台服务器安装redis集群_高性能分布式存储服务Minio安装配置入门
- html表单提交数据保存到mysql中_php – Canonical:如何将HTML表单数据保存到MySQL数据库中...
- java调用一个外部url_java 从程序内部调用外部url/接口
- STM32——库函数版——矩阵按键程序
- deeplin显示安装空间不够_太实用了!这种冷门的显示器支架可帮了大忙了