class
distributedclient
// 發生了waitpath的刪除事件
if (event.gettype() ==
eventtype
.nodedeleted
&& event.getpath().equals(waitpath))
} catch (exception e)
}});
// 等待連線建立
latch.await();
// 建立子節點
thispath = zk.create("/"
+ groupnode +
"/" + subnode, null, ids
.open_acl_unsafe,
createmode
.ephemeral_sequential);
// wait一小會, 讓結果更清晰一些
thread
.sleep(10);
// 注意, 沒有必要監聽"/locks"的子節點的變化情況
list childrennodes = zk.getchildren("/"
+ groupnode, false);
// 列表中只有乙個子節點, 那肯定就是thispath, 說明client獲得鎖
if (childrennodes.size() ==
1) else else
if (index ==
0) else }}
/*** 共享資源的訪問邏輯寫在這個方法中
*/private
void
dosomething() throws
exception finally
}public
static
void
main(string args) throws
exception catch (exception e)
}}.start();
}thread
.sleep(long
.max_value);
}} if (event.gettype() ==
eventtype
.nodedeleted
&& event.getpath().equals(waitpath)) else
}} class
distributedclient2
// 子節點發生變化
if (event.gettype() ==
eventtype
.nodechildrenchanged
&& event.getpath().equals("/"
+ groupnode))
}} catch (exception e)
}});
// 等待連線建立
latch.await();
// 建立子節點
thispath = zk.create("/"
+ groupnode +
"/" + subnode, null, ids
.open_acl_unsafe,
createmode
.ephemeral_sequential);
// wait一小會, 讓結果更清晰一些
thread
.sleep(10);
// 監聽子節點的變化
list childrennodes = zk.getchildren("/"
+ groupnode, true);
// 列表中只有乙個子節點, 那肯定就是thispath, 說明client獲得鎖
if (childrennodes.size() ==
1) }
/*** 共享資源的訪問邏輯寫在這個方法中
*/private
void
dosomething() throws
exception finally
}public
static
void
main(string args) throws
exception catch (exception e)
}}.start();
}thread
.sleep(long
.max_value);
}}
zookeeper分布式鎖
方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...
zookeeper分布式鎖
zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...
zookeeper 分布式鎖
分布式鎖肯定是用在分布式環境下。在分布式環境下,使用分布式鎖的目的也是保證同一時刻只有乙個執行緒來修改共享變數,修改共享快取 前景 jdk提供的鎖只能保證執行緒間的安全性,但分布式環境下,各節點之間的執行緒同步執行卻得不到保障,分布式鎖由此誕生。實現方式有以下幾種 基於資料庫實現分布式鎖 基於快取 ...