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