程序员谈话系列——————解开AQS的神秘面纱

一,谈一谈什么是AQS

AQS是一个用来创建锁和同步器的框架,使用AQS能够简单且高效的构造出应用广泛的大量的同步器,比如常用的ReentrantLock,Semaphore‘,其他的诸如ReentrantReadWriteLock,FutureTask等等皆是基于AQS非常轻松容易的构造出符合我们自己需求的同步器。

二,AQS原理分析

AQS核心思想是,如果被请求的共享资源空闲,那么将请求资源的线程设置为有效线程,并且将共享资源设为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待已经被唤醒时锁分配的机制,这个机制时AQS通过CLH队列实现的,将暂时获取步到锁的线程加入到队列当中。CLH队列时一个虚拟的双向队列,即不存在队列实例,仅存在结点之间的关联关系。AQS将每条请求资源的线程封装成CLH锁队列的一个节点,从而实现锁的分配。

AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成排队工作,AQS使用CAS对该同步状态进行原子操作实现对值得修改。

三,AQS对资源得共享方式

1,Exclusive(独占):只有一个线程能执行,如ReentrantLock,公平锁和非公平锁。

2,share(共享),多个线程可以同时执行,比如信号量 Semaphore栅栏 CyclicBarrier闭锁 CountDownLatch等等。

四,AQS底层使用了模板方法模式

要自定一个AQS首先要继承AbstractQueueSynchronizer并重写制定的方法,无非就是对state得获取和释放。

然后将AQS组合在自定义同步组件得实现中,并调用其模板方法,而这些模板方法会调用使用者得重写方法。

原文地址:https://www.cnblogs.com/ffdsj/p/12399190.html

时间: 2024-10-29 19:49:54

程序员谈话系列——————解开AQS的神秘面纱的相关文章

程序员谈话系列————Redis性能分析

在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题.比如微博,把热点微博[1],最新的用户关系,都存储在 Redis 中,大量的查询击中 Redis,而不走 MySQL. 那么,针对 Redis 服务,我们能做哪些性能优化呢?或者说,应该避免哪些性能浪费呢? Redis 性能的基本面 在讨论优化之前,我们需要知道,Redis 服务本身就有一些特性,比如单线程运行.除非修改 Redis 的源代码,不然这些特性,就是我们思考性能优化的基本面. 那么,有哪

程序员谈话系列——今天我们来谈一下synchronized……

说起synchronized相信大家都很熟悉,就这个东西叫做互斥锁,平时呢可以帮助我们实现譬如线程安全的问题.那么今天咱们就来深入底层,好好的谈一下synchronized的原理和应用 一.谈一下对于synchronized的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被他修饰的方法或者代码块在任意时刻只有一个线程执行.但是这个关键字虽然从功能上看还不错,但是在JDK6之前synchronized是不被人喜欢的,因为它是重量级锁

程序员谈话系列——关于redis的一些理解(二)

一,redis的数据类型都有什么? String hash list set sortedset HyperLogLog Pub/Sub 二,缓存雪崩,击穿,传统. 雪崩:一些热点数据都会做缓存,一般会同时进行定时任务刷新.如果key的失效时间时,大量的用户请求涌入会直接落到数据库上,数据库一般会报一下警,但很有可能没有反应就直接挂了.当然重启数据库也会直接被流量打死.比如如果打挂的是一个用户服务的库,那么依赖这个库的接口都会报错,如果不做熔断的话会瞬间挂到一片. 做法: 1,为了避免缓存雪崩,

程序员成长系列(一):手里必须有一套自己的框架

转眼间工作三年了,对于程序员来说,三年算是这个行业的第一道坎.回首过往,大多都是进行重复性的工作,偶尔的也会进行技术攻关,但是没多久就忘记了,除了找工作的时期,平时是不会理会的. 不知不觉间发现自己这是在通货膨胀中不断贬值. 只要还有精力,学个五年十年那都不是问题,问题是这五年十年都学了些什么.经过多天的考虑,有必要整理一下这三年的所学所得,而且手里必须得有个拿得出手的东西.于是有必要整理一套自己的框架,而且吃透弄熟,把一些常用的功能组件都剥离出来,对以后无论是做管理还是搞技术都有莫大的帮助.

程序员表白系列源码

程序员表白系列源码 这里只是借花献佛 曾经也有人进行过整理 http://download.csdn.net/album/detail/1501

解开Redis的神秘面纱

本篇博文将为你解开Redis的神秘面纱,通过阅读本篇博文你将了解到以下内容: 什么是Redis? 为什么选择 Redis? 什么场景下用Redis? Redis 支持哪些语言? Redis下载 Redis 如何安装? windows 安装 Redis 如何修改配置? Redis Strings, Lists, Sets, Sorted Sets, Hashes 多种数据类型使用 1. 什么是Redis? 亚马逊技术社区解释 超快速的开源内存中数据存储,可用作数据库.缓存.消息代理和队列. Red

程序员资源系列(不断完善中)

1. 程序员读书资源网址: 1)红黑联盟的读书频道 2. PHP资源系列: 1)PHP100中文网 2)第一PHP社区 3. 时间管理系列: 1)GTD 4. 娱乐学习系列: 1)在线读书

【程序员感悟系列】 由一点业务说开去

最近的工作不是很忙,我也趁着这个机会多读了一些技术的书籍.比如刚读完的<大话设计模式>,以将故事的形式讲述了设计模式的方方面面,感觉还是不错的.现在看的一本是英国人写的<企业应用架构模式>.对于web的企业级应用,还是挺有借鉴的意义的. 我也觉得,12年毕业到现在,自己的技术一定要精进.所以多看设计模式,企业架构.然后,一个业务上的小事改变了我的看法,公司的网站的线上出现了一个数据的异常,显示的时间信息是 1970-01-01,一看就知道是数据库存储的是0,所以php解析出来的是u

程序员人生系列

程序员的上升空间在哪里 程序员的上升空间在哪里 我见证过许多的程序员的成长,他们很多人在进入成熟期之后,技术上相对较高,一般项目开发起来比较自信,没有什么太大的困难,有的职位上也有所提升,成了项目经理.设计师,有的甚至是到了管理者的位置.又经过很长时间,这些程序员却在也没有什么变化和发展,工作稳定.情绪稳定,好像一切都在按部就班地进行着.有的程序员满足于现在的收入和职位,安于现状:有的程序员却在安于现状的同时,苦苦思索... 今天我们为什么不成功 今天我们为什么不成功? 1.首先我们没有定义好自