-1

Web からいくつかの並行 LRU キャッシュの実装を取得しました。それらには HashMap と同期ブロックがあります。私が望むのは、 ConcurrentHashMap を使用し、(可能な場合) 同期ブロックの使用を避けることです。HashMap の代わりに ConcurrentHashMap を配置しましたが、すべてがうまくいきませんでした。スレッドは map.get(key) で終了します。ConcurrentHashMap のパラメータを何らかの形でカスタマイズする必要があるのでしょうか?

        private ConcurrentHashMap<Object, LRUListEntry> map;

        protected class LRUListEntry extends Object
        {
            LRUListEntry next;
            LRUListEntry prev;
            Object value;
            Object key;
            int hits;
            final int penalty = -1;

            public String toString()
            {
                return key + "=" + value;
            }

            public Object getKey()
            {
                return key;
            }

            public Object getValue()
            {
                return value;
            }
        }
4

1 に答える 1

2

問題は、アクセスごとにprevnextLRU参照が変更され、最も最近使用されていないエントリを並べ替えることです。実装では、これらの操作がアトミックに実行されていることを前提としています。これは、同期されたブロックが削除された場合には当てはまりません。JavaLinkedHashMapはスニペットの優れた実装であり、標準ライブラリで提供されています。

ConcurrentLinkedHashMapは、LRUアルゴリズムの同時バージョンを提供します。設計ドキュメントでは、使用されたアイデアを高レベルで説明しています。このプロジェクトはGuava'sCacheの基盤であり、このプレゼンテーションで説明されているアプローチが変更されています。低レベルの詳細に興味がある場合は、どちらのプロジェクトにも優れたコードレベルのドキュメントと単体テストがあります。

于 2012-12-23T20:22:53.773 に答える