AQS原始碼閱讀感想

2021-10-02 05:13:33 字數 1221 閱讀 7302

1.aqs核心原理

--aqs擁有變數state,通過cas設定state得值是否成功判斷是否獲得鎖,原始碼如下:

compareandsetstate(c, nextc)
protected final boolean compareandsetstate(int expect, int update)
--獲得鎖失敗,則加入aqs的等待佇列,然後掛起,掛起通過:

locksupport.park(this);
public static void park(object blocker)
--釋放鎖,則喚醒等待佇列的下乙個節點,喚醒通過:

locksupport.unpark(s.thread);
2.aqs基於clh鎖,clh鎖和mcs鎖得區別

clh鎖是輪詢前乙個節點的islock屬性是否為false,來判斷前乙個節點是否釋放鎖,如果釋放了,自己獲得鎖

a<-b<-c

b節點得pre指標指向a,.輪詢a得islock屬性

mcs鎖是輪詢自己的islock屬性是否為false,

a->b->c

a得next指標指向b,a釋放鎖時將b得islock設為false

3.reentrantlock的公平鎖與非公平鎖得區別:

!hasqueuedpredecessors()

公平鎖判斷可以占有鎖得時候判斷是否有等待佇列,有的話插入佇列,非公平鎖會搶占一下試試,不判斷是否有等待佇列

4.countdownlatch原理

1.countdownlatch得建構函式傳入乙個int->將aqs得state設為int

2.主線程呼叫await(),判斷state是否為0,不為零則加入aqs得等待佇列掛起:locksupport.park(this)

3.從執行緒每呼叫一次countdown,將state-1,當state減為0,則喚醒aqs佇列

5.countdownlatch,cyclicbarrier和semaphore區別

countdownlatch:乙個主線程,n個從執行緒,主線程等待從執行緒都執行完countdown,主線程繼續: 1等n,然後1繼續

cyclicbarrier:n個執行緒,每個呼叫await,當大家都呼叫await之後,每個執行緒繼續:n個執行緒,先呼叫await的等待,最後乙個呼叫完,大家一起往下走

semaphore:鎖有數量限制,設定n個鎖,每個執行緒可以一次取m個鎖,不夠就等待,夠了就繼續

AQS原始碼閱讀

aqs是用來構建鎖或者其它同步器元件的重量級基礎框架及整個juc體系的基石,通過內建的fifo佇列來完成資源獲取執行緒的排隊工作,並通過乙個int類變數 表示持有鎖的狀態。我將以reentrantlock為切入點,閱讀asq原始碼。注 reentrantlock預設是執行緒不安全的,當然也可以設定為...

AQS原始碼閱讀筆記(一)

aqs原始碼閱讀筆記 先看下這個類張非常重要的乙個靜態內部類node。如下 static final class node 查詢當前節點的前乙個節點 final node predecessor throws nullpointerexception node node thread thread,...

oz grep c原始碼閱讀有感想

讀懂這個,基本這個程式原來不明白的地方都明白了。快速的瀏覽程式,把一些細微的地方聯絡起來,真是爽呀。比如,在函式中 re exec char lp register char c register char ep 0 register char ap nfa bol lp bopat 0 0 bop...