簡體   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