首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使java中的几个工作人员的缓存无效,而不影响性能。

同时使java中的几个工作人员的缓存无效,而不影响性能。
EN

Stack Overflow用户
提问于 2014-05-12 14:00:10
回答 1查看 838关注 0票数 0

我正在创建自己的缓存对象,它将为多个线程服务,这是一个分配,因此不允许我使用存在的包和jar。我正在设法弄清楚如何同时使它们全部失效。我有一个日期结构,其中包含一串条目,其中键是整数,值是布尔值。当工作人员错过时,它会将值添加到缓存中。我有几个其他线程更新了这个数据结构,一旦它们更新了它,只有在缓存中有这个条目的情况下,它们才会使所有拥有这个缓存的其他工作线程失效。

例如,假设有两个工作人员T1缓存有1,真T2缓存有3,真

数据结构为1,true;2,true;3 true。现在更新程序更改3,false。因此,它应该检查T1而不做任何事情,并且应该检查T2并更改它。但是,这两个检查应该同时进行,因为如果我有一个T1缓存有3的情况,真T2缓存有3,那么真T1可能失效,而T2还没有失效,而且我们有一个不一致的行为。

有什么想法吗?我的缓存代码是

代码语言:javascript
复制
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();
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 05:16:41

听起来你在想象三个线程"T1“、"T2”、"T3“都有自己的workerCache副本,它们需要保持同步。是这样的吗?

如果是的话,我会说这是个问题。与三个缓存(每个线程一个)不同,在所有线程之间共享一个缓存如何?

这样,每个人都会一直查看相同的数据-- b/c --只有一个数据副本(因为只有一个缓存)。如果您使来自T1的条目无效,那么每个人都会同时“看到”该无效--这是因为只有一个缓存。

如果有三个线程都在更新相同的键,那么最后一个进入缓存的线程将获胜。我不确定这对你来说是不是个问题。

我有接近问题的地方吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23611085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档