Pull to refresh

Comments 11

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

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

Можно подробнее о double-checked lock & Thread.MemoryBarrier()?
msdn.microsoft.com/en-us/library/system.threading.thread.memorybarrier.aspx
>MemoryBarrier is required only on multiprocessor systems with weak memory ordering (for example, a system employing multiple Intel Itanium processors).

For most purposes, the C# lock statement, the Visual Basic SyncLock statement, or the Monitor class provide easier ways to synchronize data.

www.albahari.com/threading/part4.aspx
Sign up to leave a comment.

Articles