Java多线程编程.原子操作



我正在用Java学习多线程编程。这是我的困惑。

class Cache<K, V> {
private ConcurrentMap<K, V> cache;
private ConcurrentLinkedQueue<K> lru;
public Cache () {
    // initiate cache and lru
}
public put (K key, V value) {
    // some pre-processing
    synchronized (this) {
        cache.put(key, value);
        lru.add(key);
    }
    // some post-processing
}
}

下面是一些非常简单的缓存,包含最近最少使用的记录(lru)。显然,我需要使这两个操作原子化。否则,缓存和lru的状态很可能会不一样。

现在假设我想要一个计时器任务来清理缓存,假设它将清理一半的缓存。我的问题是,我上面的代码是否确保这两个操作(放入缓存和添加lru)对clean任务来说是原子的?我可以这样做吗:

class CleanTask {
    Cache cache;   // the reference of Cache
    public void run () {
        // some pre-processing
        for (int i = 0; i < n; i++) {   // Just suppose I need remove n element
            synchronized (XXX) {
                cache.getCache().remove(cache.getLru().poll());
            }
        }
    }
}

我应该在XXX里写什么?

非常感谢!

我的问题是我上面的代码是否确保这两个操作(放入缓存和添加lru)出现在clean任务的原子?

yes(假设清理任务在不同线程中)

我应该在XXX里写什么?

相同的缓存对象,例如:synchronized (cache) {,同步应该发生在相同的锁(对象)

您还可以探索Java中的其他原子类,如果它们在您的情况下可能有用:

在您的情况下,您将在XXX上同步缓存,但是,我建议您考虑同步putgetLru方法作为替代方法。

相关内容

  • 没有找到相关文章

最新更新