[英]How do I synchronize cache list access
我遇到了以下問題(一個重要的限制-無法使用外部jar /庫,只能使用常規安裝附帶的Java原語):
X類的對象長期存儲在sql DB中。 為了性能起見,緩存了對象(需要編寫。打算將其基於LinkedHashMap)。
get(key)
:檢查對象是否在緩存中而不在使用中-返回它。 如果對象在使用中-請休眠直到可用。 如果對象不在緩存中-從數據庫讀取它。
putInCache(object)
:更新緩存中的對象(如果不存在,則添加它)。 如果緩存用盡,它將觸發緩存的saveToDB
操作,並從緩存中刪除最近最少使用的項目。
saveToDB(object)
:將對象寫入數據庫(未從緩存中刪除),並標記對象為“未更改”。
有多個線程調用get
。 線程可以更改從get
接收到的對象(該對象將被標記為“已更改”)-完成后,它將調用putInCache
。
有一個專用線程遍歷緩存對象,當遇到“已更改”對象時,它將觸發saveToDB
(在進行數據庫訪問時,該對象將被標記為已使用)。
您將如何建議確保線程安全? 基本上,我正在尋找將啟用的Java類:1. get
同步它對緩存中每個對象的訪問。 這樣它就可以檢查它是否在那里-如果已使用或免費使用。 如果使用過-它應該休眠直到可用。 2.專用線程不應在調用saveToDB
鎖定高速緩存,但仍要確保檢查了所有高速緩存且未引起飢餓(在saveToDB
運行時高速緩存可能會更改)
只是為了澄清一下,我只對鎖定/同步解決方案感興趣-可以假定像緩存觸發和數據庫訪問之類的東西。
這是一種方法:
ExecutorService
處理數據庫請求; Future
用作您的地圖值; ConcurrentHashMap
作為地圖實現。 Future
應該來自數據庫; 它將使用ExecutorService
。
當您需要對一個對象進行操作時,請在此對象的.get()
上進行同步。
此外,谷歌為“實踐中的Java並發性”,並購買該書;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.