volatile关键字可以用于构建线程安全的自动清除缓存吗?

时间:2016-09-24 06:41:04

标签: c# thread-safety observable volatile

我想编写一个自动清除缓存,在实际情况下,它会在很长时间内清除缓存中的所有项目,但会有不断的读取命中。由于清除和读取来自不同的线程,因此该数据结构需要是线程安全的。如果可能的话,想要通过这种常量读取来避免锁定,但很少写入。将_cache标记为volatile并且CleartheCache()只是一个赋值(原子)是 threadsafe

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 个答案:

答案 0 :(得分:2)

Volatile关键字在Data Structure中没有使C#线程安全,其唯一目的是告诉编译器多个线程或外部访问此Data Structure程序范围,所以不要通过缓存它的值来优化它的各种操作,每次都要进行评估,检查here

IDictionary<Key,Resource> _cache在当前表单中不是线程安全的,最好使用像ConcurrentDictionary这样的线程安全集合,或者在Write操作期间使用像Synchronization construct这样的lock限制访问。