我正在創建自己的緩存對象,它將服務於多個線程,這是一個任務,因此我不允許使用包和jar。我想弄清楚如何在同一時間使所有人無效。 我有一個日期結構,其中包含一堆條目,其中鍵是一個整數,值是一個布爾值。當工作人員遺漏時,它會將值添加到其緩存中。 我有其他幾個線程更新這個數據結構,並且一旦他們更新它們,它們應該使擁有這個緩存的所有其他工作線程無效,只有當這個條目在它們的緩存中。同時使Java中的幾個工人的緩存無效而不損害性能
例如 說,有兩名工人 T1緩存有1,真 T2緩存具有3,真
和數據結構具有如圖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();
}
}
您的緩存體系結構排除了除您的要求的全局鎖定之外的任何內容。重新設計緩存,並且當您處理緩存時,請關閉當前緩存API引入的可能的完整性差距(如果get()返回值的瞬間該值發生更改,會發生什麼情況?)。 – Durandal
這是問題,如何在更改後使所有數據無效?否則,我發現自己的情況,你剛剛描述 – Quantico
考慮責任倒置:而不是updater通知緩存,讓緩存驗證其條目是有效的每個get()。還要仔細考慮工作人員和緩存之間的可恢復性 - 誰負責處理緩存未命中?誰控制條目的完整性?誰控制數據的完整性*衍生*條目(即結果)? – Durandal