基本概念
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 ...