2015-05-09 4 views
1

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

Имея 2 потока, один увеличивается, а другой уменьшает переменную, например, и, очевидно, перед каждым доступом у меня есть мьютекс, который управляет в любой момент, только один поток «играет» с переменной.

Было бы необходимо определить как изменчивое?

+2

Почему бы не использовать 'AtomicLong' для таких операций? Правильная и эффективная реализация параллельных операций с одним и тем же целым не так проста. В JDK есть доступные классы, которые делают это для вас. –

+0

Почему вы используете семафор здесь? – Sandeep

ответ

3

С API ИХ Semaphore:

консистенция памяти эффектов: действия в потоке до вызова «освобождение» метод , таких как release()произойдет, перед тем действий после успешного метода «приобретают» например acquire() в другой теме.

Таким образом, безопасно считывать/записывать переменные, которые охраняются семафором.

1

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

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

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

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

Для вашего сценария вы можете поделиться счетчиком и сделать его летучим или лучше использовать AtomicInteger как они используют CAS механизм, который выполняет очень хорошо в условиях низкой конкуренции.

2

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

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

volatile менее строгий, чем синхронизированный, вы можете использовать volatile, когда выполняемые операции являются атомарными (чтение или запись). volatile не следует использовать, когда выполняется операция read-update-write.

+0

Почему вы предполагаете, что взаимное исключение достигается посредством синхронизации, когда он не использует синхронизированные, только семафоры? – Shondeslitch

+0

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

Смежные вопросы