并發(fā)編程中Semaphore的使用方法

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)并發(fā)編程之Semaphore的使用方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括順河網(wǎng)站建設(shè)、順河網(wǎng)站制作、順河網(wǎng)頁制作以及順河網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,順河網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到順河省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

線程去獲取鎖首先查看線程是否有中斷標(biāo)志,有就拋異常,沒有就嘗試去獲取鎖,代碼如下:
并發(fā)編程中Semaphore的使用方法


并發(fā)編程中Semaphore的使用方法
如果隊(duì)列是空的,獲取當(dāng)前抽象隊(duì)列的state,當(dāng)前的state-資源數(shù)的差值大于0(說明嘗試獲取鎖成功),cas將當(dāng)前state改成差值,并返回(整個(gè)過程自旋+cas保證了嘗試獲取鎖成功并修改state的原子性。);如果隊(duì)列有排隊(duì)的節(jié)點(diǎn)(嘗試獲取鎖失敗返回-1)或者隊(duì)列沒有排隊(duì)節(jié)點(diǎn)但是差值小于0(嘗試獲取鎖失敗,資源數(shù)太多)就要入隊(duì),代碼如下:
并發(fā)編程中Semaphore的使用方法
并發(fā)編程中Semaphore的使用方法
并發(fā)編程中Semaphore的使用方法
這里和排他鎖的區(qū)別是參數(shù)為共享模式,同樣隊(duì)列為空就初始化隊(duì)列(自旋+cas保證了初始化隊(duì)列的原子性),不為空就入隊(duì)。判斷當(dāng)前節(jié)點(diǎn)的前節(jié)點(diǎn)是否是head節(jié)點(diǎn),如果是,再次嘗試獲取鎖,如果失敗,或者當(dāng)前節(jié)點(diǎn)的前節(jié)點(diǎn)不是head就將前節(jié)點(diǎn)的ws改為-1,阻塞當(dāng)前線程park。
如果有線程釋放鎖,代碼如下:
并發(fā)編程中Semaphore的使用方法
嘗試釋放共享鎖,代碼如下:
并發(fā)編程中Semaphore的使用方法
獲取抽象隊(duì)列的state,將state+1(不一定為+1)的和,cas將state修改成和,嘗試釋放鎖成功。喚醒后續(xù)節(jié)點(diǎn),代碼如下:
并發(fā)編程中Semaphore的使用方法
喚醒頭節(jié)點(diǎn)把頭節(jié)點(diǎn)的ws=-1,將其修改為0,然后喚醒,代碼如下:
并發(fā)編程中Semaphore的使用方法
如果頭節(jié)點(diǎn)的ws=-1<0將其cas為0,下一個(gè)節(jié)點(diǎn)不為空,unpark(下一節(jié)點(diǎn)的線程),線程在阻塞的位置被喚醒,嘗試獲取鎖,代碼如下:
并發(fā)編程中Semaphore的使用方法
在循環(huán)中被喚醒,繼續(xù)嘗試獲取鎖,如果和上一次一樣失敗,則繼續(xù)park阻塞。嘗試獲取鎖成功intr = tryAcquireShared(arg)>=0,代碼如下:
并發(fā)編程中Semaphore的使用方法
將當(dāng)前節(jié)點(diǎn)設(shè)置為head(head=當(dāng)前節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的pre=null,thread=null)意味著前節(jié)點(diǎn)要被踢出隊(duì)列(差一步修改前節(jié)點(diǎn)的next=null),當(dāng)前節(jié)點(diǎn)下一節(jié)點(diǎn)為空,將前節(jié)點(diǎn)的next=null,前節(jié)點(diǎn)出隊(duì)完成,獲取鎖成功;
反之下一節(jié)點(diǎn)不為空(下一節(jié)點(diǎn)會(huì)在阻塞park前將前節(jié)點(diǎn)的ws=-1)并且為共享模式釋放鎖,代碼如下:
并發(fā)編程中Semaphore的使用方法
這里會(huì)將新的頭節(jié)點(diǎn)的ws=-1改為0,喚醒下一節(jié)點(diǎn),代碼如下:
并發(fā)編程中Semaphore的使用方法
喚醒下一線程,下一線程在阻塞的循環(huán)中被喚醒,嘗試獲取鎖,失敗再次阻塞park,成功就繼續(xù)這一步驟,一直傳播下去,也就是喚醒多個(gè)節(jié)點(diǎn)

上述就是小編為大家分享的并發(fā)編程之Semaphore的使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:并發(fā)編程中Semaphore的使用方法
文章路徑:http://muchs.cn/article6/pphcig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)網(wǎng)站營(yíng)銷、定制開發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管