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