之前在利用zookeeper實現分布式鎖時候,使用了concurrenthashmap儲存currentpath等,現在有了threadlocal,我們可以直接使用threadlocal了
把myzookeeperlock的類進行修改,其他**不變,依然可以用
public
class
myzookeeperlock
implements
lock
catch
(unsupportedencodingexception e)
}@override
public
byte
serialize
(object obj)
throws zkmarshallingerror
catch
(unsupportedencodingexception e)}}
);if(
!this
.zkclient.
exists
(lockpath)
)catch
(zknodeexist***ception e)}}
@override
public
void
lock()
else
while(!
trylock()
)}private
void
waitforlock()
@override
public
void
handledatadeleted
(string s)
throws exception };
//找到我要監聽的節點
string beforepath = localbeforepath.
get();
//開始監聽
zkclient.
subscribedatachanges
(beforepath, listener);if
(this
.zkclient.
exists
(beforepath)
)catch
(interruptedexception e)
}//結束監聽
zkclient.
unsubscribedatachanges
(beforepath, listener);}
@override
public
void
lockinterruptibly()
throws interruptedexception
@override
public
boolean
trylock()
//找到所有的節點
list
chilren =
this
.zkclient.
getchildren
(lockpath)
; collections.
sort
(chilren)
;//判斷自己是不是排在最前面
if(currentpath.
equals
(lockpath +
"/"+ chilren.
get(0)
))else
return
false;}
@override
public
boolean
trylock
(long time, timeunit unit)
throws interruptedexception
@override
public
void
unlock()
deep--;if
(deep ==0)
else
//說明鎖徹底結束了
string currentpath = localcurrentpath.
get();
if(currentpath == null)
//移除這些沒必要的
localcurrentpath.
remove()
; localbeforepath.
remove()
;//刪除節點
this
.zkclient.
delete
(currentpath);}
@override
public condition newcondition()
}
redis 運維實際經驗紀錄
redis 改版的專案上線有兩個月了,記錄一下redis 相關的經驗,也給大家乙個參照 我們的redis server是一主一從,使用r710的機器,8核心,24g記憶體 每天約插入200萬左右的資料,現在庫里有3000萬條紀錄,占用了9g的記憶體 由於現在每天記憶體增長太快,擔心很快會無法負載,因...
關於threadlocal的來龍去脈
對tls更簡單的,但是更直觀的理解可以如下 基於c語言 1.全域性物件,全域性變數的作用域和生命週期是全域性的,這裡的全域性是指程序範疇,也就是說,如果你將其設計為全域性物件,全域性變數,就意味著你希望在多執行緒的環境中,仍然能共享和訪問。全域性物件,全域性變數不是說不讓多執行緒來訪問,而是說有的時...
ThreadLocal的個人理解
threadlocal的設計思想十分簡單,它的核心物件就是threadlocalmap,被宣告在thread類裡面,每個thread都持有乙個threadlocalmap,所以才能實現執行緒隔離,以達到儲存共享變數的作用 threadlocal.threadlocalmap threadlocals...