我正在创建自己的缓存对象,该对象将服务于多个线程,这是一项分配,因此不允许我使用那里的软件包和jar。我试图弄清楚如何同时使所有这些无效。
我有一个包含大量条目的日期结构,其中键是整数,值是布尔值。当工作人员未命中时,它将值添加到其缓存中。
我还有其他几个线程会更新此数据结构,一旦更新了它们,它们将使所有具有此高速缓存的其他工作线程无效,仅当它们的高速缓存中具有此条目时。
例如
说有两个工人
T1缓存有1,true
T2缓存具有3,true
数据结构为1,真; 2,true; 3对。现在更新程序更改为3,为false。因此,它应该检查T1而不执行任何操作,而应该检查T2并进行更改。但是,这两项检查应该以某种方式同时发生,因为如果我有
T1缓存具有3,true
T2缓存具有3,true
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中的一项无效,那么每个人都会同时“看到”该无效-因为只有一个缓存。
如果您有三个线程都更新同一密钥,则最后一个进入缓存。我不确定这是否是您的问题。
我在哪里解决问题?