分布式Map中實現引用計數

2021-09-23 19:37:58 字數 2016 閱讀 4298

在《referencecountset無鎖實現

》中,詳細介紹了如何在乙個程序中實現乙個無鎖版本的referencecountset(或者說是在自己的**裡沒有鎖),但是最近遇到乙個問題,如果是在分布式的環境中呢?如何實現這個引用計數?這個問題如果從頭開始寫,會是乙個比較複雜的問題,在實際中,我們可以使用zookeeper設定時的version機制來實現,即cas(compare-and-set)。這是乙個本人在實際專案中遇到的乙個問題,但是會更簡單一些,因為在我們的專案中,我們使用gemfire,即已經有乙個現成的分布式map了(在gemfire中叫做region),所以問題簡化成如果如何使用乙個分布式map實現引用計數?

如果對concurrentmap介面比較熟悉的話,這個其實是乙個比較簡單的問題。在concurrentmap中最主要的就是引入幾個cas相關的操作:

public

inte***ce concurrentmapextends map 在《

referencecountset無鎖實現

》中我們只需要使用putifabsent就可以了,剩下的實現可以交給atomicinteger提供的cas來實現,因為它是在同乙個程序中,但是如果在分布式的環境中就不能使用這個atomicinteger,這個時候應該怎麼辦呢?其實這個時候我們就可以求助於replace方法了。replace方法的注釋中這樣描述:

/*** except that the action is performed atomically.** 

@param

key key with which the specified value is associated

* @param

oldvalue value expected to be associated with the specified key

* @param

newvalue value to be associated with the specified key

* @return

true if the value was replaced

* @throws

unsupportedoperationexception if the put operation

*         is not supported by this map

* @throws

classcastexception if the class of a specified key or value

*         prevents it from being stored in this map

* @throws

nullpointerexception if a specified key or value is null,

*         and this map does not permit null keys or values

* @throws

illegalargumentexception if some property of a specified key

*         or value prevents it from being stored in this map

*/boolean replace(k key, v oldvalue, v newvalue);

在concurrentmap的value中我們只需要給integer,然後用replace去不斷的嘗試,即自己實現乙個cas:

private

int incrementrefcount(object key)  }

integer newcount = 

new integer(curcount.intvalue() + 1);

if (distributedmap.replace(key, curcount, newcount)) 

} while (

true); }

主要邏輯就是這樣了,其實比較簡單,只是之前沒有遇到過這個問題,所以感覺可以記錄下來。或許什麼時候補充一下zookeeper版本的實現。

arc中的引用計數操作實現

你已經知道,arc會自動幫你插入retain和release語句。arc編譯器有兩部分,分別是前端編譯器和優化器。前端編譯器會為 擁有的 每乙個物件插入相應的release語句。如果物件的所有權修飾符是 strong,那麼它就是被擁有的。如果在某個方法內建立了乙個物件,前端編譯器會在方法末尾自動插入...

Python中的引用計數

為了跟蹤記錄已經分配的記憶體,python 做法類似於撲克牌遊戲中的記牌手法。乙個物件在建立時被加上乙個引用。乙個內部的引用記錄變數將跟蹤記錄下每個物件有多少個引用。乙個物件被建立和被賦值時,它的初始引用計數為 1。物件新的引用也叫別名 alias 發生在 其他變數也被賦值到同乙個物件 物件作為呼叫...

手工引用計數中規則

使用設值方法為屬性賦值時 assign retain copy三個特性的實現 self.property newvalue assign的特性會是這樣 property newvalue retain特性會是這樣 if property 0 property release property new...