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

AQS原理解析 AbstractQueuedSynchronizer

时间:2019-09-30 18:12:03      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:div   思想   ima   tran   and   container   遇到   web   维护   

 

2018.08.29 13:49:42字数 478阅读 155

AQS核心思想

如果被请求的共享资源空闲,则将当前请求线程设置为有效的工作线程,并将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及唤醒机制,这个机制是用CLH队列来实现的,将暂时获取不到锁的线程加入到队列中

 

 
技术图片
CLH队列

AQS共享资源

AQS维护了一个volatile int state(共享资源)和一个CLH队列;其中state的访问方式有三种:

  • getstate()
  • setState()
  • compareAndSetState()
    AQS定义了两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可以同时执行,如CountDownLatch)

AQS同步器

  • isHeldExclusively():线程是否正在独占资源
  • tryAcquire():独占方式,尝试获取资源
  • tryRelease():独占方式,尝试释放资源
  • tryAcquireShared():共享方式,尝试获取资源
  • tryReleaseShared():共享方式,尝试释放资源

举一个CoundDownLatch实现过程的例子,任务分为N个子线程去执行,state也初始化为N,每个子线程执行完成之后countDown()一次,state会在CAS操作下减一,当state减为零之后unpark(唤醒)主调用线程

读锁与写锁(独占与共享)的实现

CLH队列中的节点的模式是EXCLUSIVE和SHARED模式,当一个线程成功修改了state状态,表示获取了锁,如果线程所在的节点为SHARED模式,将开始一个读锁传递的过程,从头结点,向队列后续节点传递唤醒,直到队列结束或者遇到了EXCLUSIVE模式的节点,等待所有激活的读操作完成,然后进入到EXCLUSIVE模式

AQS原理解析 AbstractQueuedSynchronizer

标签:div   思想   ima   tran   and   container   遇到   web   维护   

原文地址:https://www.cnblogs.com/kelelipeng/p/11613674.html

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