Что такое семафор в Java и его использование?



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

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

Что такое семафор в Java?

Семафор - это переменная, используемая для синхронизации процессов, которая используется для управления параллельными процессами. Он также используется для управления доступом к общему ресурсу для нескольких одновременных процессов и предотвращения состояния гонки.





Типы семафоров -

  • Двоичный семафор: Бинарный семафор принимает в качестве значений только 0 и 1 и используется для реализации взаимного исключения, а также для синхронизации параллельных процессов.

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



    что такое структура данных в Java

Работа семафора

  • Если количество семафоров> 0, поток получает разрешение, уменьшая счетчик семафоров.

  • В противном случае заблокирован до получения разрешения.

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



  • Если другой поток ожидает разрешения, тогда этот поток получит разрешение в это время.

Реализация семафора

import java.util.concurrent. * // Будет принимать Resource как общий класс class Resource {static int count = 0} class MyDemo extends Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Выполнить X if (this.getName (). equals ('X')) {System.out.println ('Starting' + threadName) try {// Получит разрешение на доступ к общему ресурсу System.out.println (threadName + 'ожидание разрешения.') // получение блокировки sem.acquire () System.out.println (threadName + 'получает разрешение . ') // Теперь доступ к общему ресурсу и отдых будет ждать (int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

Вывод-
Запуск X
Начиная с Y
X ждет разрешения
Y ожидает разрешения
Х: 1
Х: 2
Х: 3
Х: 4
Х: 5
Х: 6
Х: 7
X выпускает разрешение
Y получает разрешение
Y: 6
Д: 5
Д: 4
Y: 3
Y: 2
Y: 1
Y: 0
И разрешение на выпуск
количество: 0

На этом мы подошли к концу этого блога «Семафоры в Java». Если вы хотите узнать больше о Java, ознакомьтесь с от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курс обучения и сертификации по Java J2EE и SOA от Edureka предназначен для студентов и профессионалов, которые хотят стать Java-разработчиками. Курс разработан, чтобы дать вам хорошее начало в программировании на Java и обучить вас как основным, так и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев этого блога «Что такое семафор в Java», и мы свяжемся с вами как можно скорее.