基於CAS的一些鎖(6) Semaphore

2021-10-06 02:29:45 字數 1019 閱讀 2212

基本概念

semaphore 訊號標的意思,作用其實就是限流,構造方法中可以傳乙個引數permits表示允許同時執行執行緒的數量。也可看成是訊號標、許可標記的數量。

semaphore.acquire()是阻塞方法,獲取不到訊號標就阻塞,獲取到的話訊號標permits會減1。

比如semaphore semaphore = new semaphore(1),乙個執行緒semaphore.acquire()成功後,許可標記1會變成0,這時其它執行緒無法獲得許可標記,acquire()方法會阻塞。當執行緒執行完後必須手動semaphore.release()釋放標記,這時許可標記會從0變成1,其它執行緒acquire()到後可以繼續執行。

舉個栗子

舉個例子,比如去視窗買票,new semaphore(3)就表示有3個視窗,乙個人搶先到了某個視窗前就表示acquire到了許可。3個視窗佔滿後別人只能等著,等有人買完票讓出視窗release後才能佔住視窗買票。

semaphore預設是非公平的,new semaphore(2, true) 第二個引數為true可設定成公平的。

公平就是有佇列在那裡等,需要執行的執行緒要先排隊。用收費站來舉例,假如有四輛車都在等著進乙個車道,當後面再來一輛的時候,它不會超到前面去,而是要在後面排著,這叫公平。

內部實現公平鎖用的aqs

所以說內部是有佇列的。此外reentrantlock、countdownlatch、cyclicbarrier、phaser、readwritelock、semaphore、exchanger都是用同乙個佇列,同乙個類來實現的,這個類叫aqs。

示例程式

public class t06_semaphore  catch (interruptedexception e)  finally 

}).start();

new thread(() -> catch (interruptedexception e) finally

}).start();

}}

鎖的一些概念

作業需要乙個目標之前分配目標,這樣在用目標是不用再等,可保證完成所需功能,這叫目標的分配。可用alcobj命令預先分配目標,用dlcobj解除分配 目標是根據要他們做什麼來分配的 讀或者修改 和他們是否可以共享。檔案和成員總是以 shrrd來分配。而資料用規定所狀態來分配鎖的級別。鎖狀態標誌使用的目...

鎖的一些概念

使用reentrantlock獲取鎖的時候會判斷當前執行緒是否為獲取鎖的執行緒,如果是則將同步的狀態 1 釋放鎖的時候則將狀態 1。只有將同步狀態的次數置為 0 的時候才會最終釋放鎖。使用reentrantreadwritelock,同時維護一對鎖 讀鎖和寫鎖。當寫執行緒訪問時則其他所有鎖都將阻塞,...

Cas中的一些基本概念

ticket granting ticket tgt 可以認為是cas server根據使用者名稱密碼生成的一張票,存在server端.ticket granting cookie tgc 其實就是乙個cookie,存放使用者身份資訊,由server發給client端.service ticket ...