В .NET ключевое слово lock
представляет собой синтаксический сахар вокруг Monitor.Enter
и Monitor.Exit
, поэтому вы можете сказать, что этот код
lock(locker)
{
// Do something
}
совпадает с
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Однако платформа .NET также включает класс MemoryBarrier
, который работает аналогичным образом
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Я запутался, как если бы я хотел использовать Thread.MemoryBarrier
в версии lock
/Monitor
? Меня еще больше смущает Threading Tutorial, в котором говорится, что они функционируют одинаково.
Насколько я вижу, для видимой разницы не нужен объект блокировки, который, как я полагаю, используя Monitor
, вы можете что-то делать через потоки, где MemoryBarrier
находится в одном потоке.
Моя кишка говорит мне, что другое ключевое различие MemoryBarrier
относится только к переменным, а не к методам.
Наконец, это не связано с существующим вопросом Когда использовать "volatile" или" Thread.MemoryBarrier() в потоковом коде блокировки? (С#), поскольку это фокусируется на ключевом слове volatile
, который я понимаю его использование.