缓存会在不影响性能的情况下同时使java中几个工作进程的缓存失效
我正在创建自己的缓存对象,该对象将服务于多个线程,这是一个分配,因此不允许我使用存在的包和jar。我正试图找出如何同时使所有这些无效。 我有一个日期结构,它包含一组条目,其中键是一个整数,值是一个布尔值。当工作进程未命中时,它会将该值添加到其缓存中。 我还有几个其他线程更新这个数据结构,一旦它们更新了这个数据结构,它们就应该使拥有这个缓存的所有其他工作线程失效,只有当它们的缓存中有这个条目时
比如说 假设有两个工人 T1缓存有1,true T2缓存有3个,true
并且数据结构有1,true;2、正确;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();
}
}
# 1 楼答案
听起来你好像在想象三个线程“T1”、“T2”、“T3”都有自己的
workerCache
副本,它们需要保持同步。是这样吗如果是这样,我会说这是个问题。与其使用三个缓存(每个线程一个),不如在所有线程之间共享一个缓存
这样一来,每个人都会看到相同的数据。b/c只有一个数据副本(因为只有一个缓存)。如果您使T1中的一个条目无效,那么由于只有一个缓存,每个人都会同时“看到”该无效
如果有三个线程都在更新同一个密钥,那么缓存中的最后一个线程将获胜。我不确定这是否是你的问题
我有没有接近这个问题