[b][color=olive][size=large]上篇文章,散仙介紹了,分布式環境下,基于zookeeper實作的公平的鎖,這篇,我們來看下,如何使用zookeeper來完成非公平鎖的模拟,在這之前,我們先來,了解下公平鎖和非公平鎖的差別。
JAVA JDK提供了公平鎖,與非公平鎖,但這種實作是基于同一個JVM來說的,
如果同一台機器上,不同的JVM,則可以使用檔案鎖,來實作,但是這些并不是分布式的模式,雖然可以通過RMI的方式來實作,
但比較繁瑣。在分布式的場景裡,我們可以輕松的使用zookeeper來實作公平鎖與非公平鎖
基于zookeeper實作的公平鎖與非公平鎖的差別
先來通俗的看下二者的差別
公平鎖,即先來者先得,隻有一個廁所的衛生間,想進去隻能是按排隊順序來的,比較公平,first挂掉或釋放後,會由secend得到鎖,依次類推。
非公平鎖,比較暴力,隻有一個廁所的衛生間,不用排隊,外面圍了一堆人等着上廁所,當裡面的人出來時,外面的人誰強勢,而且力氣大,誰就能進去,
極端情況下,如果兩個人一樣力氣大,這時候就該廁所門發揮作用了,一次隻能擠進去一個人,反映到我們的程式中,這時候就需要代碼同步了,保證
任何時候,隻有一個人可以拿到鎖。
二者的相同點,都保證了,任何情況下,都隻能一個人得到某種資源。但實作的方式不同。
[/size][/color][/b]
[b][color=green][size=large]
實作簡述:分布式非公平鎖的建立,除了得到鎖外,其他的多個監聽器,監聽同一個鎖的情況
實作的流程步驟如下:
[table]
|序号|介紹
|1|建立一個持久znode
|2|多個程式并發的去zk服務上,建立同一個短暫無時序性的節點路徑,當一個程式,得到鎖時,其他程式,隻能監聽,不能再次建立,建立時需要同步政策
|3|同一時刻隻能有一個建立成功者,能得到鎖
|4|沒成功者,統一監視得到鎖的節點
|5|如果中間得到鎖的節點,釋放了,或者出意外挂掉了,則重複步驟1,2,3,4
[/table]
拓撲圖如下:
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0094/6184/d1c73404-ca54-3431-bb0c-2f098577ee03.jpg[/img]
[b][color=olive][size=large]代碼如下:[/size][/color][/b]
[b][color=green][size=large]以上是實作的代碼,需要注意的是,在最後搶占鎖時,可能會一下多個節點同時去建立名字一樣的節點,由于zookeeper的特點,隻能由一個建立成功,其他的會抛出異常,為了避免這種情況,散仙,目前的想到的是,在建立一個節點時,通過線程随機休眠,來達到一個同步情況,但這扔有極端情況,雖然幾率很小,就是分布式環境下可能有多個節點随機休眠的時間是一樣的,是以第二種做法,可以在zk節點維持一個有序的分布式隊列,每次隻能第一個得到鎖,其他的繼續等待,下一次的搶占,如此一來,就能保證任何時刻隻有一個節點得到鎖。
[/size][/color][/b]
[b][color=olive][size=large]
如有什麼不足之處,歡迎指正! ^_^
[/size][/color][/b]