我想编写一个自动清除缓存,在实际情况下,它会在很长时间内清除缓存中的所有项目,但会有不断的读取命中。由于清除和读取来自不同的线程,因此该数据结构需要是线程安全的。如果可能的话,想要通过这种常量读取来避免锁定,但很少写入。将_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>();
}
答案 0 :(得分:2)
Volatile
关键字在Data Structure
中没有使C#
线程安全,其唯一目的是告诉编译器多个线程或外部访问此Data Structure
程序范围,所以不要通过缓存它的值来优化它的各种操作,每次都要进行评估,检查here
IDictionary<Key,Resource> _cache
在当前表单中不是线程安全的,最好使用像ConcurrentDictionary
这样的线程安全集合,或者在Write
操作期间使用像Synchronization construct
这样的lock
限制访问。