繁体   English   中英

在不影响性能的情况下,同时使Java中多个工作程序的缓存无效

[英]concurrently invalidate cache of several workers in java without hurting performances

我正在创建自己的缓存对象,该对象将服务于多个线程,这是一项分配,因此不允许我使用那里的软件包和jar。 我试图弄清楚如何同时使所有这些无效。 我有一个包含大量条目的日期结构,其中键是整数,值是布尔值。 当工作人员未命中时,它将值添加到其缓存中。 我还有其他几个线程会更新此数据结构,一旦更新了它们,它们将使所有具有此高速缓存的其他工作线程无效,仅当它们的高速缓存中具有此条目时。

例如说有两个工作程序T1缓存具有1,true T2缓存具有3,true

数据结构为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();
        }
    }

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

如果是这样,我会说这是一个问题。 而不是三个高速缓存(每个线程一个),如何在所有线程之间共享一个高速缓存?

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

如果您有三个线程都更新同一密钥,则最后一个进入缓存。 我不确定这是否是您的问题。

我在哪里解决问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM