手擼JDK之Semaphore那點事

2021-10-09 16:44:18 字數 1125 閱讀 6676

首先明確一點,削峰限流不一定非要用mq佇列,其實jdk就給我們提供了良好的環境semaphore他主要作用是以【時間換空間】也就是我們現在處理不了的請求讓他稍等一會,之後我們閒暇的空間了在處理他,此處主要是jdk已經實現了削峰限流所以手擼乙個讓自己更加深刻。

semaphore無非就是將不能處理的請求放入佇列中,在可以處理的時候拿出。

/**

* 用於儲存執行緒

*/private linkedblockingqueue

requestqueue =

newlinkedblockingqueue

<

>()

;/**

* 外部傳入令牌數量,用於什麼時候讓執行緒進入阻塞

*/private atomicinteger tokennumber;

public

mysemaphore

(integer tokennumber)

這步沒啥可說的繼續!!

/**

* 是否能獲取令牌

*/public

boolean

tryacquire()

return tokennumber.

get(

)>0;

}

主要判斷是否可以獲取令牌,以及不將重複的執行緒放入佇列中

/**

* 獲取令牌

*/public

void

acquire()

else

}

獲取令牌則將筒中的令牌-1,沒有則阻塞

/**

* 用完了釋放令牌 只有是當前佇列中的執行緒才允許釋放令牌,並且檢測是否在休眠執行緒,是則喚醒

*/public

void

release()

}}}

當然是有借有還再借不難啦,此處主要考慮的是是否是當前佇列中的執行緒還回令牌,以及執行緒的狀態,主要是以喚醒了別再二次喚醒了,當然這地方只考慮到喚醒了就不喚醒了,還沒考慮執行緒其他狀態

ps:此處還差公平,但是一直實現不了,主要還剩乙個死活不被喚醒很蛋疼!如有大手看到請不吝嗇賜教!!!

純手擼 堆排序

堆排序學習筆記 外婆的澎湖灣 前提 堆用完全二叉樹表示時,其表示方法不唯一,但可以確定的是樹的根結點要麼是無序表中的最小值,要麼是最大值。思想 步驟 二叉堆在實現的時候,是採取陣列的形式來儲存的。從二叉堆中刪除乙個元素,為了充分利用空間,其實我們是可以把刪除的元素直接存放在二叉堆的最後乙個元素那裡的...

劉老師手擼系列

自劉老師部落格 劉老師手擼系列之一 手擼orm 劉老師手擼系列之二 手擼web框架 劉老師手擼系列之三 手擼快取系統 劉老師手擼系列之四 手擼session 劉老師手擼系列之五 手擼rpc 遠端過程呼叫 劉老師手擼系列之六 手擼秒殺系統 持續更新.十天快速入門python python從入門到web...

echarts 手擼簡單動態markLine

這就讓我很尷尬了啊.因為我接到乙個需求.這個需求呢,是這樣的 畫個圖,三條線,乙個代表上限,乙個代表下限,乙個是實際值.實際值超過上限或者下限的地方標紅一下.實際內容下來了之後呢 我就有點懵逼了 怎麼這個上限和這個下限還是個陣列格式的呢 什麼都沒有 別人公司的需求都不上班的嗎 行吧行吧,我想想辦法 ...