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,纔會啓動; html

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

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

 

總結:aqs理解原理就好了,由於了它與鎖的結合已經幫咱們默認實現了內部機制,無需關心它。框架

相關文章
相關標籤/搜索