Java의 Semaphore는 무엇이며 그 용도는 무엇입니까?



세마포어는 프로세스 동기화에 사용됩니다. 이 블로그는 자바에서 세마포어의 다양한 유형과 구현에 대해 설명합니다.

세마포어 카운터를 통해 공유 리소스에 대한 액세스를 제어합니다. 이것은 스레드 동기화 누락 된 신호를 방지하거나 중요한 섹션을 보호하기 위해 스레드간에 신호를 보내는 데 사용되는 구성입니다. Java의 Semaphores에 대한이 블로그에서는 개념을 자세히 이해할 것입니다.
이 블로그에서 다루는 주제는 다음과 같습니다.

Java의 Semaphore 란 무엇입니까?

세마포어는 동시 프로세스 관리에 사용되는 프로세스 동기화에 사용되는 변수입니다. 또한 여러 동시 프로세스에서 공통 리소스에 대한 액세스를 제어하고 경쟁 조건을 방지하는 데 사용됩니다.





세마포어 유형 –

  • 이진 세마포어 : 이진 세마포어는 0과 1 만 값으로 사용하며 동시 프로세스를 동기화 할뿐만 아니라 상호 배제를 구현하는 데 사용됩니다.

  • 세마포어 계산 : 임의의 지점에서 계수 세마포어의 값은 정확히 동시에 중요 섹션에 들어갈 수있는 최대 프로세스 수를 나타냅니다.



세마포의 작동

  • 세마포어 개수가 0보다 크면 스레드는 허용을 획득하여 세마포어 개수를 줄입니다.

    c 튜토리얼의 연결 목록
  • 그렇지 않으면 허가를받을 수있을 때까지 차단됩니다.

  • 스레드가 더 이상 공유 리소스에 액세스 할 필요가 없으면 허용을 해제하여 세마포어 수를 늘립니다.



  • 다른 스레드가 허가를 기다리고있는 경우 해당 스레드는 해당 시간에 허가를 얻습니다.

세마포어 구현

import java.util.concurrent. * // 자원을 공유 클래스로 사용합니다. 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 허가를 기다리고
X : 1
X : 2
X : 3
X : 4
X : 5
X : 6
X : 7
X는 허가를 해제합니다
Y는 허가를 얻습니다.
Y : 6
Y : 5
Y : 4
Y : 3
Y : 2
Y : 1
Y : 0
그리고 방출 허가
개수 : 0

이것으로 우리는 '자바의 세마포어'에 대한이 블로그의 끝으로 왔습니다. Java에 대해 자세히 알아 보려면 다음을 확인하십시오. 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Java 개발자가 되고자하는 학생과 전문가를 위해 설계되었습니다. 이 과정은 Java 프로그래밍을 시작하고 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념 모두에 대해 교육하도록 설계되었습니다.

질문이 있으십니까? 'What is Semaphore in Java'블로그의 댓글 섹션에 언급 해 주시면 최대한 빨리 답변 드리겠습니다.