簡體   English   中英

如何同步緩存列表訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM