Comments 11
А еще у меня вопрос.
На сколько я понял, у вас один кэш на все вызовы методов. Соответственно, если вызывается метод из двух потоков с разными аргументами, то один из них будет стоять на lock'e, ожидая другого с другими аргументами, хотя смысла в этом ожидании нет. Разве не так?
Да, вы правы. Однако суть этой статьи — сделать пример использования фреймворка. Плюс, это перевод оригинальной статьи. От автора я получил разрешение только на перевод.
… поэтому мы должны проверить существование ключа дважды: вне заблокированного кода и внутри его...

Это называется double-checked lock.
И да, в очень редких случаях даже он может профейлить, поэтому при выходе из лока надо дёрнуть Thread.MemoryBarrier();
Вообще говоря, хитростей много. Статья ориентирована на любой уровень подготовки, потому объясняется все :)
Посмотрел оригинал, там даже ссылка на вики есть про этот паттерн. Так что тоже поставьте.
Ну а насчёт того, что автор оригинала проигнорил барьер — он сам себ злой буратина, как говорится
“One in a million is next Tuesday”
А вот тут мне уже стало очень интересно.

Можно подробнее о double-checked lock & Thread.MemoryBarrier()?
Only those users with full accounts are able to leave comments. Log in, please.