大話(huà)ReentrantLock

晚飯后,老王和媳婦在路上走侄非。
“聽(tīng)說(shuō)今天診所又有人打架了蕉汪?”老王媳婦突然說(shuō)。
“兩對(duì)年輕的夫婦逞怨,都是來(lái)給孩子看病的者疤,說(shuō)實(shí)在的,我也的確沒(méi)有看清楚他們到底誰(shuí)先來(lái)的叠赦,但他們都說(shuō)自己先來(lái)的驹马。”老王無(wú)奈的說(shuō)除秀。
“要是我也能看病就好了糯累,這樣他們就不用打架了〔岵龋”媳婦安慰老王寇蚊。
“咱兩都看病,誰(shuí)抓藥呢棍好!”老王心中的無(wú)奈更重了仗岸。
老王和媳婦的診所在可樂(lè)鎮(zhèn)開(kāi)了二十年了,因?yàn)樾Ч媒梵希瑑r(jià)格也公道扒怖,所以每天慕名前來(lái)看病的人不少。
“你看這樣行不行业稼,”兩人沉默了一會(huì)兒盗痒,老王突然說(shuō),“我們?cè)陂T(mén)上掛一個(gè)牌子低散,誰(shuí)先拿到這個(gè)牌子俯邓,就先給誰(shuí)看∪酆牛”
“但是搶牌子會(huì)不會(huì)打架稽鞭?”媳婦問(wèn)。
“不會(huì)引镊,牌子上會(huì)隨機(jī)附上一道關(guān)于健康知識(shí)的問(wèn)題朦蕴,誰(shuí)先答上來(lái)誰(shuí)就先拿到牌子篮条。”老王早有準(zhǔn)備吩抓。
“會(huì)不會(huì)同時(shí)答上來(lái)涉茧?”
“會(huì)不會(huì),誰(shuí)先答上來(lái)的疹娶,還不是由咱們說(shuō)了算伴栓。”老王有點(diǎn)得意雨饺。
“那沒(méi)有搶到牌子的怎么辦钳垮?”
“我準(zhǔn)備重新改造下現(xiàn)在的候診區(qū),給每個(gè)座位編上號(hào)沛膳,然后按照從小到大的順序排列,沒(méi)有搶到牌子的就到最小且空閑的號(hào)上等待汛聚。新進(jìn)來(lái)的人可以直接排隊(duì)锹安,也可以不排隊(duì),直接去搶牌子倚舀√究蓿”
“那他肯定搶不到......”媳婦機(jī)智地說(shuō)。
“也不一定痕貌,假如當(dāng)他去搶牌子的時(shí)候风罩,看完病的人正好出來(lái)把牌子復(fù)位到了門(mén)上......”
“也對(duì),這個(gè)時(shí)候就能搶到牌子了舵稠〕”
“也不一定,因?yàn)榭赐瓴〉娜诉€會(huì)喚醒等待隊(duì)列最前面的人哺徊∈易粒”老王給剛才候診的隊(duì)列起了個(gè)名字叫等待隊(duì)列。
“對(duì)落追,這個(gè)時(shí)候就是兩人回答問(wèn)題競(jìng)爭(zhēng)了盈滴。”媳婦恍然大悟轿钠。

代碼實(shí)現(xiàn)故事
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
} // 公平鎖:進(jìn)來(lái)后巢钓,直接去排隊(duì)   非公平鎖:進(jìn)來(lái)后,先搶一次牌子疗垛,再去排隊(duì)
final void lock() {
    if (compareAndSetState(0, 1)){
        setExclusiveOwnerThread(Thread.currentThread());
    }  // 先搶一次牌子    
    else{
        acquire(1);
    }          
}
public final void acquire(int arg) {
    if (!tryAcquire(arg) // 沒(méi)有搶到牌子
        &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg)){ // 排隊(duì)
        selfInterrupt();
    }   
}
/**
排隊(duì)邏輯:
1症汹、0號(hào)椅子不坐人,隊(duì)列的頭和尾都指向0號(hào)椅子
2贷腕、第一個(gè)人坐1號(hào)椅子烈菌,隊(duì)列的頭指向0號(hào)椅子阵幸,隊(duì)列的尾指向1號(hào)椅子
3、第二個(gè)人坐2號(hào)椅子芽世,隊(duì)列的頭指向0號(hào)椅子挚赊,隊(duì)列的尾指向2號(hào)椅子
4、以此類(lèi)推
**/
private Node addWaiter(Node mode) {
    Node node = new Node(Thread.currentThread(), mode);
    Node pred = tail; 
    if (pred != null) {
      node.prev = pred;
      if (compareAndSetTail(pred, node)) { 
        pred.next = node;
        return node;
      }
    }
    enq(node);
    return node;
 }
 private Node enq(final Node node) {
    for (; ; ) {
      Node t = tail;
      if (t == null) { 
        if (compareAndSetHead(new Node()))
        tail = head;
      } else {
        node.prev = t;
        if (compareAndSetTail(t, node)) {
          t.next = node;
          return t;
        }
      }
    }
 }

“如果搶到牌子的人進(jìn)來(lái)后济瓢,卻發(fā)現(xiàn)自己沒(méi)有帶醫(yī)避睿卡,怎么辦旺矾?”媳婦突然問(wèn)蔑鹦。
“候診室內(nèi),我開(kāi)辟了幾塊空間箕宙,每塊空間的椅子也編上號(hào)嚎朽,然后按照從小到大的順序排列,沒(méi)有帶醫(yī)奔砼粒卡的在一塊空間排隊(duì)哟忍,沒(méi)有帶身份證的在一塊空間排隊(duì),總之一類(lèi)人一個(gè)隊(duì)伍陷寝」埽”老王說(shuō)。
“那我們現(xiàn)在的地方豈不是不夠用了凤跑”玻”媳婦擔(dān)憂(yōu)的說(shuō)。
“按照我的想法仔引,條件隊(duì)列沒(méi)有數(shù)量限制扔仓,”老王給剛才的空間起了個(gè)名字,“不過(guò)一般情況也不會(huì)有那么多人去排隊(duì)咖耘,所以我們先緊著目前的地方用当辐,不夠用了再說(shuō)±鹂矗”老王自行的說(shuō)缘揪。
“那他們就一直在那里排隊(duì),醫(yī)币骞穑卡也不會(huì)自己飛過(guò)來(lái)找他們罢殷荨!”媳婦又提出一個(gè)擔(dān)憂(yōu)慷吊。
“那是自然的袖裕,他們得通知家里人,把醫(yī)备绕浚卡送過(guò)來(lái)急鳄,然后喚醒他到等待隊(duì)列中繼續(xù)去排隊(duì)谤民。”老王解釋到疾宏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末张足,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坎藐,更是在濱河造成了極大的恐慌为牍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岩馍,死亡現(xiàn)場(chǎng)離奇詭異碉咆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蛀恩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)疫铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人双谆,你說(shuō)我怎么就攤上這事壳咕。” “怎么了佃乘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵囱井,是天一觀的道長(zhǎng)驹尼。 經(jīng)常有香客問(wèn)我趣避,道長(zhǎng),這世上最難降的妖魔是什么新翎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任程帕,我火速辦了婚禮,結(jié)果婚禮上地啰,老公的妹妹穿的比我還像新娘愁拭。我一直安慰自己,他們只是感情好亏吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布岭埠。 她就那樣靜靜地躺著,像睡著了一般蔚鸥。 火紅的嫁衣襯著肌膚如雪惜论。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天止喷,我揣著相機(jī)與錄音馆类,去河邊找鬼。 笑死弹谁,一個(gè)胖子當(dāng)著我的面吹牛乾巧,可吹牛的內(nèi)容都是我干的句喜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沟于,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咳胃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起社裆,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拙绊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泳秀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體标沪,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年嗜傅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了金句。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕嘀,死狀恐怖违寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偶房,我是刑警寧澤趁曼,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站棕洋,受9級(jí)特大地震影響挡闰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掰盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一摄悯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧捕,春花似錦奢驯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至邮偎,卻和暖如春管跺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钢猛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工伙菜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人命迈。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓贩绕,卻偏偏與公主長(zhǎng)得像火的,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淑倾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361