volatile关键字可以用于构建线程安全的自动清除缓存吗?
本文关键字:清除 缓存 安全 关键字 用于 线程 构建 volatile | 更新日期: 2023-09-27 18:08:39
我想编码一个自动清除缓存,在实际场景中清除缓存中的所有项目一次在许多小时,但有恒定的读取命中。由于清除和读取来自不同的线程,这个数据结构需要是线程安全的。如果可能的话,希望避免使用锁,但很少使用写常数。与_cache标记为volatile和clearecache()只是一个赋值(原子)这是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>();
}
Volatile
关键字不能使Data Structure
线程在C#
中是安全的,它的唯一目的是告诉编译器这个Data Structure
被多个线程或程序作用域之外访问,所以不要通过缓存它的值来优化对它的各种操作,让它每次都被求值,查看这里
IDictionary<Key,Resource> _cache
在当前形式下不是线程安全的,最好使用ConcurrentDictionary
这样的线程安全集合,或者在Write
操作期间使用Synchronization construct
这样的lock
来限制访问