java 세마포어 예제 속시원내과 | 2019년 8월 2일

“java.util.concurrent.BinarySemaphore”라는 클래스가 없습니다. 세마포를 계산하면 동시에 1 스레드가 임계 섹션에 액세스하지 않을 때 이진 세마포어로 사용할 수 있습니다. 거기, 당신은 예상 된 결과가 무엇인지 언급하지 않았다. 예상되는 결과가 항상 “내부”를 얻고 “외부”를 얻는 것이라면 잘못될 것입니다. 예제에서는 실제로 는 결코 일어나지 않아야 합니다. 그러나 더 많은 스레드가 시작되거나 기다리지 않으면 “내부”를 얻을 수 있습니다… maxx 즉, 항상 새로운 세마포어(1)는 하나의 스레드만 특정 리소스에 액세스할 수 있습니다. 먼저 java.util.concurrent.Semaphore로 시작합니다. 세마포를 사용하여 특정 리소스에 액세스하는 동시 스레드 수를 제한할 수 있습니다. 이제 쇼핑객이 3 개의 동일한 노트북과 3 개의 동일한 키를 가지고 있다고 가정 해 봅시다. 세마포어는 무료 동일한 노트북 키의 수입니다.

세마포 수 (키 의 개수는) 처음에 3으로 설정됩니다 (세 개의 노트북은 모두 무료입니다), 다음 카운트 값은 고객이 들어오는대로 감소됩니다. 모든 랩톱이 사용 중인 경우( 즉, 랩톱에 무료 키가 남아 있지 않은 경우) 세마포 수는 0입니다. 이제 고객이 랩톱을 반환하면 세마포가 1(무료 키 1개)으로 증가하고 대기열의 다음 고객에게 제공됩니다. 여러 소비자가 있는 경우 어떻게 해야 합니까? 위의 Java 자습서에서 소비자 (생산자가 아님)는 경주 조건을 방지하기 위해 패킷을 읽을 때 버퍼를 잠그어야합니다 (세마포를 획득 할 때는 아님). 아래 예제에서는 모든 것이 동일한 JVM에 있기 때문에 생산자도 목록을 잠그습니다. 문서의 첫 번째 줄은 뮤텍스는 ressource에 1 및 1 동시 가속만 허용하는 세마포어라고 명시되어 있습니다. 따라서 코드가 동일하게 “보기”하지만 첫 번째 코드가 아닌 이유 : // max 4 people 정적 세마포어 = 새로운 세마포어 (4); 및 제2 코드: // max 1명 정적 세마포세마포 = 새로운 세마포어(1); 이 클래스는 프린터 큐/프린터를 나타냅니다. 이 세마포어 생성자의 매개 변수로 값 1을 전달하므로 이진 세마포를 만듭니다. 세마포어는 종종 일부(물리적 또는 논리적) 리소스에 액세스할 수 있는 것보다 스레드 수를 제한하는 데 사용됩니다. 예를 들어, 여기에 항목의 풀에 대 한 액세스를 제어 하는 세마포를 사용 하는 클래스: 위의 튜토리얼CrunchifySemaphoreMutexTutorial.java CrunchifyProducer crunchifyList 링크리스트 개체에 스레드 이름을 추가할 때 세마포를 신호할 수 있습니다. Java에서는 세마포어를 사용하여 특정 리소스에 액세스하는 스레드 수를 제한할 수 있습니다.

Comments are closed.