1. 程式人生 > 其它 >併發程式設計(五)

併發程式設計(五)

在併發環境下,加鎖和解鎖需要以下三個部件的協調:

鎖狀態。我們要知道鎖是不是被別的執行緒佔有了,這個就是 state 的作用,它為 0 的時候代表沒有執行緒佔有鎖,可以去爭搶這個鎖,用 CAS 將 state 設為 1,如果 CAS 成功,說明搶到了鎖,這樣其他執行緒就搶不到了,如果鎖重入的話,state進行+1 就可以,解鎖就是減 1,直到 state 又變為 0,代表釋放鎖,所以 lock() 和 unlock() 必須要配對啊。然後喚醒等待佇列中的第一個執行緒,讓其來佔有鎖。

執行緒的阻塞和解除阻塞。AQS 中採用了 LockSupport.park(thread) 來掛起執行緒,用 unpark 來喚醒執行緒。

阻塞佇列。因為爭搶鎖的執行緒可能很多,但是隻能有一個執行緒拿到鎖,其他的執行緒都必須等待,這個時候就需要一個 queue 來管理這些執行緒,AQS 用的是一個 FIFO 的佇列,就是一個連結串列,每個 node 都持有後繼節點的引用。