码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-03 00:35:23      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:sync   tran   共享方式   分配   自己   封装   非公平锁   需要   dwr   

一,谈一谈什么是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组合在自定义同步组件得实现中,并调用其模板方法,而这些模板方法会调用使用者得重写方法。

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

标签:sync   tran   共享方式   分配   自己   封装   非公平锁   需要   dwr   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!