Що таке монітор, м'ютекс і семафор це одне і теж або різні речі stack overflow російською

Просто скрізь написано по-різному. І ніяк не можу зрозуміти, що по суті означає кожне з цих понять. Наприклад, у того ж Еккель є такі рядки про це:

Для вирішення проблеми суперництва потоків фактично все багатопотокові схеми синхронізують доступ до ресурсів, що розділяються. Це означає, що доступ до ресурсу в один момент часу може отримати тільки один потік. Найчастіше це виконується приміщенням фрагмента коду в секцію блокування так, що одночасно пройти по цьому фрагменту коду може тільки один потік. Оскільки така пропозиція блокування дає ефект взаємного виключення, цей механізм часто називають м'ютексів (MUTual Exclusion).

У Java є вбудована підтримка для запобігання конфліктам у вигляді ключового слова synchronized. Коли потік бажає виконати фрагмент коду, що охороняється словом synchronized, він перевіряє, чи доступний семафор, отримує доступ до семафора, виконує код і звільняє семафор.

Сам я читав в одній статті (і поки дотримуюся цього розуміння), що м'ютекс - це якийсь об'єкт, який пов'язаний з кожним об'єктом в Джава, і який може приймати два стани: зайнятий і вільний. А про монітор в тій же статей було написано, що це якийсь спеціальний механізм (по суті - шматок коду), який, використовуючи м'ютекс, регулює доступ ниток до деякого блоку коду (тобто він відповідає за захоплення нитки ресурсу, і дозволяє тільки однієї даної нитки (яка захопила м'ютекс) йти з даного, що охороняється монітором, блоку коду; відповідно, іншим ниткам монітор не дає зайняти цей ресурс і цей блок коду; а коли нитка виходить з цього блоку коду, то монітор звільняє мьютекс і дозволяє іншим ниткам увійти в цей блок коду). Це правильне розуміння?

А що конкретно означають ці поняття в Джаві?

В цілому, можна вважати, що мютекс це окремий випадок семафора. Семафор працює просто - у нього є якесь початкове число - лічильник. Кожен раз, коли якийсь потік "захоплює" семафор, це число зменшується на одиницю. Якщо воно дорівнює нулю або менше нуля - семафор закривається (тобто, грубо кажучи, код зупиняється на момент захоплення семафора). Кожен раз, коли семафор звільняється - цей лічильник збільшується на одиницю. І якщо він після цього виявиться більше нуля, то яким то безпідставного потоку, який "висить на захопленні семафора" буде посланий сигнал на пробудження і він зможе продовжити роботу (природно, знову зменшивши значення лічильника).

Найбільш очевидний приклад семафора - це менеджери закачувань - додаємо багато файлів на закачування, але обмежуємо кількість одночасних перегонів.

що м'ютекс - це якийсь об'єкт, який пов'язаний з кожним об'єктом в Джава, і який може приймати два стани: зайнятий і вільний.

це майже близько до істини. Так, в java у класу Object є поле типу мютекс. І всі спадкоємці (читай всі інші класи) також отримують персональний мютекс. якщо метод помітити словом syncronized, то це просто загортає його виклик в цей мютекс. Тобто, якщо викликати syncronized методи у одного об'єкта з різних потоків - мютекс не дасть їм виконуватися паралельно. Але для різних об'єктів (навіть одного типу) це вже не працює.

Схожі статті