2011-06-25 152 views
4

我想在Zookeeper中實施屏障。當有少量節點需要加入才能通過障礙時,我的實現始終工作。然而,當我用100多個需要加入障礙的節點測試我的實現時,大約1%的時間看起來像其中一個節點缺少最後一個觀察者事件,並且沒有檢查以查看子節點的數量障礙節點已經改變。動物園管理員屏障實施

我甚至同步觀察者上的過程方法,但是這並沒有改變任何東西。下面是我的過程方法的代碼,以及檢查是否需要前進的邏輯。

觀察過程:

public BarrierWatcher(FastBarrier FastBarrier) { 
     this.ofb = FastBarrier; 
    } 

    @Override 
    public synchronized void process(WatchedEvent event) { 
     synchronized (ofb) { 
     ofb.notify(); 
     } 
    } 

邏輯來控制阻擋機構:

BarrierWatcher bw = new BarrierWatcher(this); 
List<String> memberList = zk.getChildren(barrierPath, bw); 
synchronized(this) { 
    while (memberList.size() < numOfMembers) { 
    this.wait(1000); 
    memberList = zk.getChildren(barrierPath, bw); 
    } 
} 

而不是僅僅調用this.wait(),我不得不添加this.wait(1000)爲罕見失敗發生。一旦所有節點加入,它就會一直通過屏障。我確定同步過程方法可以解決這個問題,但它沒有。任何人有任何這方面的經驗,或一個想法我可能做錯了什麼?

+0

對不起,在代碼格式。我不確定那是怎麼發生的。我希望這不會讓你無法閱讀。 –

+0

發佈你的代碼的其餘部分,這是不足以找出發生了什麼。 – sbridges

回答