1. 程式人生 > >Lock介面(鎖的實現)

Lock介面(鎖的實現)

鎖的功能實現基於佇列同步器AQS,通過內建的FIFO佇列來完成資源獲取執行緒的排隊工作;同步器的三個基本方法getState()setState(int newstate)compareAndSetState(int expect,int update)(通過CAS設定當前狀態,保證原子性);同步器在獲取鎖時提供了一些模板方法去獲取和釋放鎖或者查詢執行緒狀態acquire()acquireShared()release()等。AQS內建的FIFO佇列是一個雙向佇列,其佇列的每一個節點都是一個執行緒節點的封裝,包含執行緒狀態、前節點、後繼節點等資訊,同步器中也有headtail的成員變數。所以一個鎖的具體實現本質就是在不斷的進行佇列的出隊和入隊操作,沒有獲得鎖便把這個節點設定為同步佇列的尾節點,這個入隊需要
CAS設定,因為有執行緒安全的問題。首節點是獲得鎖的節點,它在釋放鎖的同時會喚醒後繼節點。同步佇列中的所有執行緒節點其實都處於不斷的自旋過程(是否能夠CAS設定成功)(這裡有個公平鎖與非公平鎖的區別,公平鎖在獲取鎖之前還有檢查它的前繼節點是否為首節點)。同時鎖的實現也分獨佔鎖和共享鎖,下面以可重入鎖和讀寫鎖的實現為例。可重入鎖保證同一個執行緒可以多次持有某個鎖,不會發生讓自己阻塞自己的情況,互斥鎖Mutex不可重入;典型應用是一個帶同步的遞迴函式。