AQS原理解析 AbstractQueuedSynchronizer

 

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模式

猜你喜欢

转载自www.cnblogs.com/kelelipeng/p/11613674.html