[英]concurrently invalidate cache of several workers in java without hurting performances
我正在創建自己的緩存對象,該對象將服務於多個線程,這是一項分配,因此不允許我使用那里的軟件包和jar。 我試圖弄清楚如何同時使所有這些無效。 我有一個包含大量條目的日期結構,其中鍵是整數,值是布爾值。 當工作人員未命中時,它將值添加到其緩存中。 我還有其他幾個線程會更新此數據結構,一旦更新了它們,它們將使所有具有此高速緩存的其他工作線程無效,僅當它們的高速緩存中具有此條目時。
例如說有兩個工作程序T1緩存具有1,true T2緩存具有3,true
數據結構為1,真; 2,真實的; 3對。 現在更新程序更改為3,為false。 因此,它應該檢查T1而不執行任何操作,而應該檢查T2並進行更改。 但是,這兩個檢查應該以某種方式同時發生,因為如果我遇到T1緩存具有3的情況,則真實T2緩存具有3,則真實T1可能無效,而T2尚未無效,並且我們不一致行為。
有任何想法嗎? 我的緩存代碼是
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
public class workerCache {
@SuppressWarnings("rawtypes")
LinkedHashMap cache;
ReentrantLock lock;
@SuppressWarnings("serial")
public <T> workerCache(final int maxEntries) {
this.lock = new ReentrantLock();
this.cache = new LinkedHashMap<T, T>(maxEntries + 1) {
@SuppressWarnings("rawtypes")
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > maxEntries;
}
};
}
@SuppressWarnings("unchecked")
public <T> void setEntry(T key, T value) {
lock.lock();
try {
cache.put(key, value);
} finally {
lock.unlock();
}
}
public <T> void invalidateEntry(T key) {
lock.lock();
try {
cache.remove(key);
} finally {
lock.unlock();
}
}
@SuppressWarnings("unchecked")
public <T> T get(T key) {
lock.lock();
try {
return (T) this.cache.get(key);
} finally {
lock.unlock();
}
}
聽起來您正在想象三個線程“ T1”,“ T2”,“ T3”都有自己的workerCache
副本,它們需要保持同步。 這是正確的嗎?
如果是這樣,我會說這是一個問題。 而不是三個高速緩存(每個線程一個),如何在所有線程之間共享一個高速緩存?
這樣,每個人一直在b / c上看到相同的數據,因此只有一個數據副本(因為只有一個緩存)。 如果您使T1中的一項無效,那么每個人都會同時“看到”該無效-因為只有一個緩存。
如果您有三個線程都更新同一密鑰,則最后一個進入緩存。 我不確定這是否是您的問題。
我在哪里解決問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.