有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

缓存会在不影响性能的情况下同时使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) 个答案

  1. # 1 楼答案

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

    如果是这样,我会说这是个问题。与其使用三个缓存(每个线程一个),不如在所有线程之间共享一个缓存

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

    如果有三个线程都在更新同一个密钥,那么缓存中的最后一个线程将获胜。我不确定这是否是你的问题

    我有没有接近这个问题