2016-09-24 1 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

Ваш вопрос слишком широк, поскольку он охватывает два языка (Java и C#), в которых 'volatile' означает существенно разные вещи. Поскольку вы, по-видимому, больше заинтересованы в C#, удалите Java-тег. –

ответ

2

Volatile ключевое слово не делает Data Structure поточно в C#, его единственная цель состоит в том, чтобы сообщить компилятору, что этот Data Structure имеет доступ к нескольким потокам или вне рамок программы, поэтому не оптимизировать различные операции это за счет кэширования его значение, пусть это будет оцениваться каждый раз, проверить here

IDictionary<Key,Resource> _cache не поточно в текущем виде, предпочтительно использовать либо безопасный сбор темы как ConcurrentDictionary или во время Write операции использовать Synchronization construct как lock можно запретить Доступ s.

+0

@StephenC Я изменил свой ответ и указал на другой ответ по тому же вопросу, что и раньше, что кажется гораздо более правдоподобным, поскольку он указывает на документацию –

+0

@StephenC, я не согласен с вами, это возможная проблема , с моим ограниченным знанием Java, я указал на лучшую ссылку сейчас, спасибо за разъяснение. –

+0

Ответ, который вы сейчас связали, касается Java. Я не имею права говорить о C# –