zookeeper 分布式鎖實(shí)現(xiàn)

分布鎖實(shí)現(xiàn)方案和優(yōu)缺點(diǎn)先占坑
鎖重入待實(shí)現(xiàn)!!初斑!

//核心邏輯
tryLock():搶鎖
       1 創(chuàng)建臨時(shí)序列節(jié)點(diǎn),創(chuàng)建后阻塞,
       2 zk.create()成功后蔫耽,在回調(diào)函數(shù)中,通過(guò)zk.getChildren()獲取當(dāng)前根目錄下序列節(jié)點(diǎn)帕棉,
       3 在回調(diào)函數(shù)中判斷自己是否是第一節(jié)點(diǎn)针肥,是則獲得鎖,不是香伴,則watch前一個(gè)節(jié)點(diǎn)慰枕,
       4 如果前一個(gè)節(jié)點(diǎn)被刪除,則zk.getChildren()即纲,重復(fù)3具帮,4步驟;
work(): 搶鎖成功后的業(yè)務(wù)邏輯
unLock():釋放鎖

遺留問(wèn)題低斋,如何設(shè)計(jì)鎖重入蜂厅?

/**
 * @author haowq 2021/4/7 14:58
 */
public class WatchCallback implements Watcher, AsyncCallback.StringCallback, AsyncCallback.Children2Callback , AsyncCallback.StatCallback {
    private ZooKeeper zk;
    private String pathName;
    private String threadName;
    //Getter Setter
    private CountDownLatch latch = new CountDownLatch(1);

    public ZooKeeper getZk() {
        return zk;
    }

    public void setZk(ZooKeeper zk) {
        this.zk = zk;
    }


    public void tryLock(){
        //創(chuàng)建序列節(jié)點(diǎn)
        try {
            System.out.println(threadName + "create lock ....");
            zk.create("/lock",threadName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,this,"AsyncCallback.StringCallback");
            //阻塞,搶鎖膊畴,搶鎖操作在回調(diào)函數(shù)中完成
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public void unLock(){
        try {
            zk.delete(pathName,-1);
            System.out.println(threadName + " over work....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }

    }


    public void process(WatchedEvent event) {
        //如果第一個(gè)哥們掘猿,那個(gè)鎖釋放了,其實(shí)只有第二個(gè)收到了回調(diào)事件4娇纭稠通!
        //如果衬衬,不是第一個(gè)哥們,某一個(gè)改橘,掛了滋尉,也能造成他后邊的收到這個(gè)通知,從而讓他后邊那個(gè)跟去watch掛掉這個(gè)哥們前邊的飞主。狮惜。。
        switch (event.getType()) {
            case None:
            case NodeDataChanged:
            case NodeChildrenChanged:
            case NodeCreated:
                break;
            case NodeDeleted:
                zk.getChildren("/",false,this ,"syncCallback.Children2Callbac");
                break;
        }

    }

    // AsyncCallback.StringCallback
    @Override
    public void processResult(int rc, String path, Object ctx, String name) {
        System.out.println(name);
        pathName = name;
        //節(jié)點(diǎn)創(chuàng)建成功碌识,需要查看自己得序列號(hào) 判斷是否獲得鎖
        zk.getChildren(pathName,this,this,"Children2Callback");

    }


    //AsyncCallback.Children2Callbac
    @Override
    public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
        //查看自己的序列
        Collections.sort(children);

        String substring = path.substring(1);
        int i = children.indexOf(substring);
        //如果序列最小 獲得鎖
        if(i ==0){
            //yes
            System.out.println(threadName +" i am first....");
            try {
                zk.setData("/",threadName.getBytes(),-1);
                latch.countDown();
            } catch (KeeperException | InterruptedException e) {
                e.printStackTrace();
            }
        }else{
            //Watch 上一個(gè)序列點(diǎn)
            zk.exists("/"+children.get(i-1),this, this,"Children2Callback");
        }

    }

    //AsyncCallback.StatCallback
    @Override
    public void processResult(int rc, String path, Object ctx, Stat stat) {

    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碾篡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丸冕,更是在濱河造成了極大的恐慌耽梅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胖烛,死亡現(xiàn)場(chǎng)離奇詭異眼姐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)佩番,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)众旗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人趟畏,你說(shuō)我怎么就攤上這事贡歧。” “怎么了赋秀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵利朵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猎莲,道長(zhǎng)绍弟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任著洼,我火速辦了婚禮樟遣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘身笤。我一直安慰自己豹悬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布液荸。 她就那樣靜靜地躺著瞻佛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娇钱。 梳的紋絲不亂的頭發(fā)上涤久,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天涡尘,我揣著相機(jī)與錄音忍弛,去河邊找鬼响迂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛细疚,可吹牛的內(nèi)容都是我干的蔗彤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疯兼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼然遏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吧彪,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤待侵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姨裸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秧倾,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年傀缩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了那先。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡艰,死狀恐怖售淡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慷垮,我是刑警寧澤揖闸,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站料身,受9級(jí)特大地震影響汤纸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惯驼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一蹲嚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祟牲,春花似錦隙畜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乡恕,卻和暖如春言询,著一層夾襖步出監(jiān)牢的瞬間俯萎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工运杭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夫啊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓辆憔,卻偏偏與公主長(zhǎng)得像撇眯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虱咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容