Что такое мьютекс и семафор в Java? В чем основное отличие?

Что такое мьютексы и семафор в Java? В чем основное отличие?

Ответ 1

Семафор можно подсчитать, в то время как мьютекс может рассчитывать только на 1.

Предположим, что у вас есть поток, который принимает соединения с клиентом. Этот поток может одновременно обрабатывать 10 клиентов. Затем каждый новый клиент устанавливает семафор до тех пор, пока он не достигнет 10. Когда у Семафора есть 10 флагов, ваш поток не будет принимать новые соединения

Мьютекс обычно используется для защиты вещей. Предположим, что ваши 10 клиентов могут получить доступ к нескольким частям системы. Затем вы можете защитить часть системы с помощью мьютекса, поэтому, когда к этой подсистеме подключен 1 клиент, никто не должен иметь доступ. С этой целью вы также можете использовать Семафор. Мьютекс - это "Взаимное исключение семафора" .

Ответ 2

К сожалению, все пропустили самое важное различие между семафором и мьютексом; концепция " собственности".

Семафоры не имеют понятия собственности, это означает, что любой поток может освобождать семафор (это может привести к множеству проблем само по себе, но может помочь с "обнаружением смерти" ). В то время как мьютекс имеет концепцию владения (т.е. Вы можете только отпустить мьютекс, который вы приобрели).
Собственность невероятно важна для безопасного программирования параллельных систем. Я всегда рекомендую использовать мьютекс, предпочитая семафор (но есть последствия для производительности).

Мьютекс также может поддерживать наследование приоритетов (что может помочь в решении проблемы инверсии приоритета) и рекурсия (исключая один тип взаимоблокировки).

Следует также отметить, что существуют "двоичные" семафоры и "подсчет/общие" семафоры. Семафор Java - это счетный семафор и, таким образом, позволяет его инициализировать со значением, большим одного (тогда как, как указано, мьютекс может быть только концептуальным подсчетом одного). Полезность этого указала на другие должности.

Итак, чтобы обобщить, если у вас нет нескольких ресурсов для управления, я всегда рекомендую мьютекс над семафором.

Ответ 3

Мьютекс - это в основном взаимное исключение. Только один поток может сразу получить ресурс. Когда один поток получает ресурс, никому другому потоку не разрешено приобретать ресурс до тех пор, пока поток, владеющий ресурсом, не освободится. Все потоки, ожидающие получения ресурса, будут заблокированы.

Семафор используется для управления количеством выполняемых потоков. Будет установлен фиксированный набор ресурсов. Счет ресурсов будет уменьшаться каждый раз, когда поток принадлежит одному и тому же. Когда счет семафора достигает 0, никакие другие потоки не могут получить ресурс. Потоки блокируются до тех пор, пока другие потоки не будут иметь ресурсы.

Короче говоря, основное отличие состоит в том, сколько потоков разрешено сразу же приобретать ресурс?

  • Mutex - имеет значение ONE.
  • Семафор - его DEFINED_COUNT, (как и количество семафоров)

Ответ 4

Мьютекс используется для последовательного доступа к ресурсу, в то время как семафор ограничивает доступ к ресурсу до заданного числа. Вы можете думать о мьютексе как семафоре с числом доступа 1. Независимо от того, что вы задали для семафора, можно ли потоки получить доступ к ресурсу до того, как ресурс заблокирован.

Ответ 5

Ответ на Feabhas очень важен - мьютекс проверяет поток, пытающийся освободить мьютекс, фактически владеет им. У меня было это как вопрос интервью, поэтому стоит попытаться запомнить его.

Ответ 6

Семафор - это механизм синхронизации подсчета, а мьютекс - нет.

Ответ 7

Мьютекс часто известен как двоичный семафор. Хотя семафор может быть создан с любым ненулевым счетчиком, мьютекс концептуально является семафором с верхним счетчиком 1.

Ответ 8

У этого вопроса есть соответствующие ответы и ссылка на официальное руководство Java: Есть ли Mutex в Java?

Ответ 9

Вы сравниваете несравненное, технически нет никакой разницы между Семафором и мьютексом, это не имеет смысла. mutex это просто значимое имя, как любое имя в вашей логике приложения, это означает, что вы инициализировать семафор в "1", он обычно используется для защиты ресурса или защищенной переменной, чтобы обеспечить взаимное исключение.

Ответ 10

Mutex - двоичный семафор. Он должен быть инициализирован с помощью 1, так что будет выполняться принцип First Come First Serve. Это приводит нас к другому специальному свойству каждого мьютекса: тот, кто сделал вниз, должен быть тем, кто делает вверх. Эрго мы получили взаимное исключение из-за некоторого ресурса.

Теперь вы могли видеть, что мьютекс является частным случаем общего семафора.

Ответ 11

Объект синхронизации Семафор реализует классический светофор. Светофоры контролируют доступ к ресурсу, совместно используемому счетчиком. Если счетчик больше нуля, предоставляется доступ; Если оно равно нулю, доступ запрещен. Счетчик подсчитывает разрешения, разрешающие доступ к общему ресурсу. Затем для доступа к ресурсу поток должен получать разрешение от светофора. В общем, для использования светофора поток, который хочет получить доступ к общему ресурсу, пытается получить разрешение. Если количество светофоров больше нуля, поток получает разрешение, а количество светофора уменьшается. В противном случае поток блокируется до тех пор, пока он не получит разрешение. Когда поток больше не нуждается в доступе к общему ресурсу, он освобождает разрешение, поэтому количество светофора увеличивается. Если есть еще один поток, ожидающий разрешения, он приобретает разрешение в то время. Семафорский класс Java реализует этот механизм.

Семафор имеет двух строителей:

Semaphore(int num)
Semaphore(int num, boolean come)

num указывает начальный счет разрешения. Затем num указывает количество потоков, которые могут обращаться к общему ресурсу в данный момент времени. Если num равен единице, он может одновременно обращаться к ресурсу по одному потоку. Установив come как истинный, вы можете гарантировать, что потоки, которые вы ожидаете, получили разрешение в том порядке, в котором они запрашивали.

Ответ 12

Semaphore:

Счетный семафор. Концептуально семафор поддерживает набор разрешений. Каждый acquire() блокирует, если необходимо, до получения разрешения, а затем берет его. Каждый release() добавляет разрешение, потенциально освобождая блокирующего покупателя. Однако фактические объекты разрешения не используются; Семафор просто подсчитывает количество доступных и действует соответственно.

Семафоры часто используются для ограничения количества потоков, чем доступ к некоторому (физическому или логическому) ресурсу

Java не имеет встроенного API Mutex. Но он может быть реализован как двоичный семафор.

Семафор, инициализированный одним, и который используется таким образом, что он имеет только одно доступное разрешение, может служить блокировкой взаимного исключения. Это более широко известно как двоичный семафор, поскольку он имеет только два состояния: одно доступное разрешение или нулевые разрешения.

При использовании таким образом двоичный семафор обладает свойством (в отличие от многих реализаций блокировки), что "блокировка" может быть освобождена потоком, отличным от владельца (поскольку семафоры не имеют понятия собственности). Это может быть полезно в некоторых специализированных контекстах, таких как восстановление взаимоблокировок.

Итак ключевые различия между семафором и мьютексом:

  • Семафор ограничивает количество потоков для доступа к ресурсам. Mutex позволяет только одному потоку обращаться к ресурсу.

  • Ни один из тем не владеет Семафор. Темы могут обновлять количество разрешений, вызывая методы acquire() и release(). Мьютексы должны быть разблокированы только потоком, удерживающим блокировку.

  • Когда используется мьютекс с переменными состояния, имеется подразумеваемый брекетинг - ясно, какая часть программы защищена. Это не обязательно относится к семафору, который можно назвать одновременным программированием - он мощный, но слишком простой в использовании в неструктурированном, неопределенном виде.