2016-09-24 8 views
3

実際のシナリオではキャッシュ内のすべてのアイテムを何時間も消去しますが、一定の読み込みヒットを持つ自動クリアキャッシュを作成したいと思います。クリアと読み取りは異なるスレッドから行われるため、このデータ構造はスレッドセーフである必要があります。できるだけロックを避けたいのですが、この一定の読み込みでは非常に書き込みはほとんどありません。 _cacheがvolatileとマークされ、CleartheCache()が唯一の代入(アトミック)になっているのはこれですthreadsafeスレッドセーフな自動クリアキャッシュの作成にvolatileキーワードを使用できますか?

public class AutoClearCache 
{ 
    volatile IDictionary<Key,Resource> _cache = new Dictionary<Key, Resource>(); 

    public AutoClearCache(TimeSpan autocleanInterval) 
    { 
     var observable = Observable.Interval(autocleanInterval); 
     observable.Subscribe((r) => CleartheCache()); 
    } 

    private void CleartheCache() 
    { 
     _cache = new Dictionary<Key, Resource>(); 
    } 
+1

あなたの質問は、「volatile」が著しく異なることを意味する2つの言語(JavaとC#)をカバーしているため、広すぎます。明らかにC#に興味があるので、Javaタグを削除してください。 –

答えて

2

Volatileキーワードは、その唯一の目的は、このData Structureは、複数のスレッドによって、またはプログラムのスコープ外でアクセスされたコンパイラを伝えることですC#Data Structureスレッドセーフをしないので、上のさまざまな操作を最適化していませんそれは、その値をキャッシュすることにより、

IDictionary<Key,Resource> _cachehereは、好ましくは、現在の形でスレッドセーフのいずれかConcurrentDictionaryようまたはWrite動作時にスレッドセーフなコレクションを使用していないチェック制限するSynchronization constructlockなどを使用し、それが毎回評価されてみましょうアクセスs。

+0

@StephenC私は自分の答えを修正し、以前の質問と同じ質問で別の答えを指摘しました。これは文書を指しているので、はるかに妥当と思われます。 –

+0

@StephenC、私はあなたに同意していません。私のJavaについての知識は限られていますが、私はこれをより良いリンクにしています。 –

+0

あなたが今リンクしてきた答えは、Javaについては正しいです。私はC#について話す資格がありません。 –

関連する問題