Это не ясно из вашего кода, как это myobj
получить, чтобы быть видимым внутри mymethod
. Похож, что var myobj
- это локальная переменная стека в области декларации (начиная с var
). В этом случае может быть, что каждый поток будет иметь отдельный экземпляр, а mymethod
не будет блокироваться.
Update
О целом FIFO аргумент, некоторые справочную информацию обязательно: CLR не обеспечивает Syncronization. Это хост CLR , который предоставляет это как услугу для среды выполнения CLR. Хост реализует IHostSyncManager и другие интерфейсы и предоставляет различные примитивы syncronisation. Это может показаться слишком важным, поскольку наиболее распространенным хостом является типичный хост приложения (т. Е. Вы компилируете в и exe), и это делит всю синхронизацию с ОС (ваши старые примитивы книги Petzold в Win32 API). Однако есть, по крайней мере, еще два основных аспекта хостинга: один ASP.Net (я не уверен, что это делает) и SQL Server. То, что я могу сказать наверняка, заключается в том, что SQL Server предоставляет все примитивы на вершине SOS (который в основном является пользователем более операционной системы), никогда не касаясь примитивов ОС, а примитивы SOS несправедливы по дизайну, чтобы избежать конвоев блокировки (т.е. guranteed no FIFO). Поскольку ссылка в другом ответе уже была указана, примитивы ОС начали также обеспечивать несправедливое поведение по той же причине, что и избежать блокировки конвоев.
Для получения дополнительной информации о блокировке конвоях вы должны прочитать статьи Rick Vicik в Designing Applications for High Performance:
замок Convoy
ФИФО замки гарантируют справедливость и вперед прогресса за счет вызывая блокировку конвои , Термин первоначально означал несколько потоков исполнителей ту же часть коды, как группу, что приводит к более высоким столкновениям чем если бы они были случайным образом распределены по всему коду (так же, как автомобили быть сгруппированы в пакеты светофора).Специфическое явление , о котором я говорю, хуже , потому что, как только он образует неявное , передача права собственности на блокировку сохраняет потоки в блокировке.
Для иллюстрации рассмотрим пример , где нить удерживает замок, а выгружается при удерживании замка. Результат - все остальные темы будет накапливаться в списке ожидания для этого lock. Когда превентивная нить (замок владелец в это время) снова запускается и освобождает замок, он автоматически передает права собственности на замок на первый поток в ожидании . Этот поток может не работать в течение некоторое время, но галочки «удерживать время» . Предыдущий владелец обычно запрашивает блокировку снова перед список ожидания очищается, увековечению конвоя
Не обязательно, см .: http://stackoverflow.com/questions/961869/is-there-a-synchronization-class-that-guarantee-fifo-order-in-c/961904 –