Якщо ви передаєте тип значення, він буде заблокований, і наступного разу, коли код запрацює тут, він знову буде заблокований, і це не буде один і той самий об'єкт двічі, тому його неможливо заблокувати
Замок(x)
{ ...
}
Фактично блокування здійснюється через об'єкт Monitor:
Вищезазначене еквівалентне:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); спробуйте
{ ...
} зрештою
{ System.Threading.Monitor.Exit(obj);
}
Потім процитуємо оригінальні слова MSDN: Використовуйте Monitor для блокування об'єктів (тобто типів посилань), а не для типів значень. Коли ви передаєте змінну типу значення до Enter, вона заблоковується як об'єкт. Якщо ви знову передаєте ту ж змінну в Enter, вона буде розділена як окремий об'єкт, і поток не блокується. У цьому випадку код, який Monitor нібито захищає, не захищений. Крім того, коли ви передаєте змінну в Exit, створюється ще один окремий об'єкт. Оскільки об'єкт, переданий у Exit, відрізняється від об'єкта, переданого в Enter, Monitor запускає SynchronizationLockException. Для отримання додаткової інформації дивіться концептуальну тему Монітори. |