Сообщение Re: "Этюд" от 11.10.2023 12:13
Изменено 11.10.2023 12:22 m2user
Re: "Этюд"
HashTable не является thread safe, что проявит себя тем или иным образом (для Dictionary обычно exception) при конкурентном вызове метода Process в разных потоках.
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).
Поправить вышеуказанную проблему можно например так.
Но лучше так:
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).
Поправить вышеуказанную проблему можно например так.
void Process(id)
{
lock(Cache.Storage) {
Cache.Populate(id);
// периодически выдает данные для чужих "id"
var key = Cache.Storage[Key];
}
}
Но лучше так:
static class Cache
{
public static Hashtable { get; } Storage = Hashtable.Synchronized(new Hashtable());
public static object Populate(int id)
{
var data = GetFromDb(id);
Storage[Key] = GetFromDb(id);
return data;
}
}
Re: "Этюд"
HashTable не является thread safe, что проявит себя тем или иным образом (для Dictionary обычно exception) при конкурентном вызове метода Process в разных потоках.
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).
Поправить вышеуказанную проблему можно например так.
Но лучше так:
Дополнено: Из кода не вполне ясно, что именно _lock синхронизировал. Возможно GetFromDb. Тогда _lock всё же нужен.
А ещё конкурентный поток может подменять Cache.Storage (объект и контент коллекции).
Поправить вышеуказанную проблему можно например так.
void Process(id)
{
lock(Cache.Storage) {
Cache.Populate(id);
// периодически выдает данные для чужих "id"
var key = Cache.Storage[Key];
}
}
Но лучше так:
static class Cache
{
public static Hashtable { get; } Storage = Hashtable.Synchronized(new Hashtable());
public static object Populate(int id)
{
var data = GetFromDb(id);
Storage[Key] = GetFromDb(id);
return data;
}
}
Дополнено: Из кода не вполне ясно, что именно _lock синхронизировал. Возможно GetFromDb. Тогда _lock всё же нужен.