2018.08.29 13:49:42字数 478阅读 155
AQS核心思想
如果被请求的共享资源空闲,则将当前请求线程设置为有效的工作线程,并将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及唤醒机制,这个机制是用CLH队列来实现的,将暂时获取不到锁的线程加入到队列中
![](https://upload-images.jianshu.io/upload_images/9248810-332dd4a54222c560.png?imageMogr2/auto-orient/strip|imageView2/2/w/852/format/webp)
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模式