Разница между монитором и замком?
8 ответов
Например, в C# .NET оператор блокировки эквивалентен:
Monitor.Enter(object);
try
{
// Your code here...
}
finally
{
Monitor.Exit(object);
}
Тем не менее, имейте в виду, что монитор также может Wait()
а также Pulse()
, которые часто полезны в сложных многопоточных ситуациях.
Изменить: в более поздних версиях.NET Framework это было изменено на:
bool lockTaken = false;
try
{
Monitor.Enter(object, ref lockTaken);
// Your code here...
}
finally
{
if (lockTaken)
{
Monitor.Exit(object);
}
}
Они связаны. Например, в C# оператор блокировки представляет собой простую оболочку try-finally, которая вводит монитор и завершает его по завершении.
Мониторы - это "полуавтоматические" блокировки с помощью компилятора. Они позволяют объявить synchronized
методы на уроках и т. д. Это просто другой подход к обеспечению взаимного исключения. Я обнаружил, что эта книга является наиболее полным объяснением концепций, хотя в основном она предназначена для разработчиков ОС.
Monitors - это конструкция языка программирования, которая выполняет те же функции, что и полуфоры / блокировки, но Monitors управляет общими данными путем синхронизации во время выполнения. Напротив, блокировки защищают общие данные просто "вращением", которое может привести к плохой загрузке ЦП.
Разницы нет, блокировка генерирует Monitor.Enter и Monitor.Exit в блоке try/finally. Использование монитора над блокировкой позволяет вам выполнить точную настройку, поскольку он имеет Pulse и PulseAll. Вы также можете иметь альтернативную обработку, если не сможете получить блокировку с помощью TryEnter.
Насколько я понял, монитор - это набор принципов синхронизации потоков, а блокировки - это способ, которым мониторы реализованы в Java, наряду с функциями "взаимодействия потоков", такими как ожидание и уведомление. Таким образом, эффективно, если мы попытаемся сформировать точную взаимосвязь между двумя понятиями, блокировки будут одной частью реализации мониторов (другая - это механизмы ожидания и уведомления). Пожалуйста, поправьте меня, если я ошибаюсь, но я был бы очень признателен, если бы исправление было очень конкретным.
Блокировка обеспечивает взаимное исключение.
Монитор связывает данные, которые должны быть защищены, и примитивы взаимного исключения и синхронизации, необходимые для защиты доступа к данным.
Синхронизация используется, например, когда вам нужен один поток, чтобы дождаться, когда произойдет событие (например, подождите, пока другой поток не поместит элемент в очередь).
Блокировка фокусируется только на взаимном исключении, но Moniter обеспечивает взаимное исключение автоматически.
Поэтому нам не нужно беспокоиться об использовании взаимного исключения в Monitor. Вместо ME нам нужно учитывать sycronzing только тогда, когда мы занимаемся программированием.
Монитор обеспечивает более систематический способ программирования. Следовательно, он более продвинутый.