У меня есть статический System.Collections.Generic.Dictionary<K, V>
, который используется в качестве кэша.При промахе кеша я выполняю дорогостоящую работу, чтобы получить значение для указанного ключа и сохранить его в кеше:
private static Dictionary<K, V> _cache = ...
public static V GetValue<K>(K key)
{
V value;
if (!_cache.TryGetValue(key, out value))
{
value = GetExpensiveValue(key);
_cache[key] = value; // Thread-safety issue?
}
return value;
}
Это обычная схема.Вопрос в том, безопасен ли он или может произойти сбой, когда несколько потоков пытаются вызвать GetValue()
одновременно?
Предполагая, что GetExpensiveValue
всегда возвращает одно и то же значение для данного ключа, я недействительно волнует, какая нить выигрывает состояние гонки.Да, это означает, что дорогостоящая операция потенциально выполняется больше, чем нужно, но это может быть компромиссом, с которым я могу быть доволен, если чтения выполняются гораздо чаще, чем записи, и это позволяет мне устранить блокировку.Но что-то не так внутри словаря?То есть, в некоторых случаях он создает исключение или портит данные?Я проверил это с помощью простого консольного приложения и не нашел никаких проблем, но, конечно, это не значит, что оно всегда будет работать.