我正在创建自己的缓存对象,它将为多个线程服务,这是一个分配,因此不允许我使用存在的包和jar。我正在设法弄清楚如何同时使它们全部失效。我有一个日期结构,其中包含一串条目,其中键是整数,值是布尔值。当工作人员错过时,它会将值添加到缓存中。我有几个其他线程更新了这个数据结构,一旦它们更新了它,只有在缓存中有这个条目的情况下,它们才会使所有拥有这个缓存的其他工作线程失效。
例如,假设有两个工作人员T1缓存有1,真T2缓存有3,真
数据结构为1,true;2,true;3 true。现在更新程序更改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();
}
}发布于 2014-05-14 05:16:41
听起来你在想象三个线程"T1“、"T2”、"T3“都有自己的workerCache副本,它们需要保持同步。是这样的吗?
如果是的话,我会说这是个问题。与三个缓存(每个线程一个)不同,在所有线程之间共享一个缓存如何?
这样,每个人都会一直查看相同的数据-- b/c --只有一个数据副本(因为只有一个缓存)。如果您使来自T1的条目无效,那么每个人都会同时“看到”该无效--这是因为只有一个缓存。
如果有三个线程都在更新相同的键,那么最后一个进入缓存的线程将获胜。我不确定这对你来说是不是个问题。
我有接近问题的地方吗?
https://stackoverflow.com/questions/23611085
复制相似问题