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


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

11 101

11 ответов:

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

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

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

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

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

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

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

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

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

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

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

  • мьютекс --его один.
  • семафор -- его DEFINED_COUNT, ( как счетчика семафора)

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

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

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

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

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

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

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

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

семафор имеет два строители:

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

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

семафор:

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

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

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

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

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

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

  1. семафор ограничить количество потоков для доступа к по ресурсу разрешений. Мьютекс позволяет только одному потоку получить доступ к ресурсу.

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

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