AQS: 什么是AQS?


AQS定義了一套多線程訪問共享資源的同步器框架. 許多同步類實現都依賴於它,如常用的ReentrantLock/ReentrantReadWriterLock/CountDownLatch
這些類里面都維護了一套aqs的子類,利用子類實現的功能。該隊列里面維護的是一堆線程節點。
核心思想是當前線程獲取鎖的時候如果失敗了,就被加入到阻塞隊列中(fifo雙向隊列)配合鎖一起使用的。
主要關注getstate().setstate(),compareandsetstate(int expect,int update)
當狀態值為0的時候說明沒有線程獲取鎖,否則有線程獲取鎖,在此當中在判斷是不是當前線程,(可重入鎖的特性)
可重入鎖可以設置公平鎖和非公平鎖,
非公平鎖需要進行2次的cas然后在進入隊列,公平鎖是看一下對列里面是否有排隊的線程,有的話直接添加到隊列的尾部排隊。
CountDownLatch 調用 await() 方法時,先去獲取 state 的值,當計數器不為0的時候,說明還有需要等待的線程在運行,則調用 doAcquireSharedInterruptibly 方法,進來執行的第一個動作就是嘗試加入等待隊列 ,即調用 addWaiter()方法,await() 方法是線程阻塞,直到計數器為0,才會啟動;

如何設置和怎么實現的參見:https://zhuanlan.zhihu.com/p/45305463;

參照:https://www.cnblogs.com/waterystone/p/4920797.html;http://ifeve.com/java-special-troops-aqs/

 

總結:aqs理解原理就行了,因為了它與鎖的結合已經幫我們默認實現了內部機制,無需關心它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM