Семафоры не следует использовать вместо синхронных, поскольку семафоры не имеют исключительной взаимной блокировки, даже если они инициализированы одним, например, синхронизированы на каком-либо объекте. Верно, что семафор, инициализированный одним, позволяет только одному потоку за один раз получить доступ к объекту, который имеет разрешение. Но нить, которая имеет разрешение , не имеет его, любая другая нить может освободить это разрешение и получить разрешение. Таким образом, два потока могут получить доступ к одному и тому же объекту одновременно, и если оба потока будут манипулировать этим объектом, будут возникать проблемы многопоточности, такие как потерянное обновление, устаревшее чтение и т. Д.
В вашем примере из 2 потоков , один увеличился и один уменьшил ту же переменную.взаимное исключение является достаточным, а волатильная декларация не требуется. здесь я предполагаю, что взаимное исключение достигается через синхронизацию, а не семафоры.
volatile менее строгий, чем синхронизированный, вы можете использовать volatile, когда выполняемые операции являются атомарными (чтение или запись). volatile не следует использовать, когда выполняется операция read-update-write.
Почему бы не использовать 'AtomicLong' для таких операций? Правильная и эффективная реализация параллельных операций с одним и тем же целым не так проста. В JDK есть доступные классы, которые делают это для вас. –
Почему вы используете семафор здесь? – Sandeep