JAVA 다중 스레드 신호량(Semaphore) 인스턴스 상세 정보

java Semaphore
소개
신호량(Semaphore)은 때때로 신호등이라고 불리며 다중 스레드 환경에서 사용하는 시설로 각 스레드를 조율하여 공공 자원을 정확하고 합리적으로 사용할 수 있도록 한다.
하나의 계수 신호량.개념적으로 말하자면, 신호량은 하나의 허가 집합을 유지했다.필요하면 허가가 사용되기 전에 모든 acquire () 를 막고 이 허가를 받습니다.release () 마다 라이센스를 추가하면 막힌 수령자를 방출할 수 있습니다.그러나 실제 허가 대상을 사용하지 않고 Semaphore는 사용 가능한 허가 번호만 계수하고 해당하는 행동을 취한다.신호량을 받은 라인은 코드에 들어갈 수 있고, 그렇지 않으면 기다릴 수 있다.acquire () 와release () 를 통해 접근 허가를 얻고 방출합니다.
개념
Semaphore는 단값과 다수치 두 가지로 나뉘는데 전자는 한 라인에서만 얻을 수 있고 후자는 몇 개의 라인에서 얻을 수 있다.
주차장 운영을 예로 들다.간단하게 말하자면, 주차장에 세 개의 좌석만 있다고 가정하면, 처음에는 세 개의 좌석이 모두 비어 있었다.이때 만약 다섯 대의 차가 동시에 왔다면 문지기는 그 중 세 대가 방해받지 않고 들어갈 수 있도록 허락한 후에 차를 내려놓고 막고, 나머지 차는 반드시 입구에서 기다려야 하며, 그 후의 차도 어쩔 수 없이 입구에서 기다려야 한다.이때 한 대의 차가 주차장을 떠났는데 문지기가 알게 된 후에 차를 열어 가로막고 한 대를 넣었다. 만약 또 두 대를 떠나면 두 대를 넣을 수 있었다. 이렇게 왕복했다.
이 주차장 시스템에서 차의 위치는 공공 자원으로 모든 차는 하나의 노선과 같고 문지기가 하는 것은 신호량의 작용이다.
더 나아가 신호량의 특성은 다음과 같다. 신호량은 비음정수(차위수)이고 그 라인을 통과하는 모든 (차량)는 이 정수를 1(물론 자원을 사용하기 위해서) 줄일 것이다. 이 정수가 0일 때 그 라인을 통과하려는 모든 시도는 대기 상태에 있다.신호량에서 Wait(대기) 및 Release(방출) 두 가지 작업을 정의합니다.하나의 스레드가 Wait(대기) 작업을 호출할 때, 신호량이 1보다 많거나 초과될 때까지 신호량을 줄이거나 계속 기다립니다.Release(방출)는 사실상 신호량에 대한 조작을 수행하고 차량이 주차장을 떠나는 것에 대응한다. 이 조작을'방출'이라고 하는 것은 조작이 사실상 신호량에 의해 지켜지는 자원을 방출했기 때문이다.
Java에서는 이 신호량이 공평한 모드를 사용할지 여부를 설정할 수 있으며, 공평한 방식으로 실행되면 라인은 도착하는 순서(FIFO)에 따라 실행되고, 비공평한 경우 대기열의 머리 뒤에 요청할 수 있습니다.
JDK는 다음과 같이 정의됩니다.
        Semaphore(int permits, boolean fair)
지정된 라이센스 수와 지정된 공평한 설정이 있는 Semaphore를 만듭니다.
Semaphore는 현재 다중 스레드 환경에서 확대 사용되고 있으며 운영체제의 신호량은 매우 중요한 개념으로 프로세스 제어에 응용되고 있다.Java 병렬 라이브러리 Semaphore는 신호량 제어를 쉽게 할 수 있습니다. Semaphore는 자원이 동시에 접근할 수 있는 개수를 제어할 수 있습니다. acquire () 를 통해 허가를 받을 수 있습니다. 없으면 기다리고,release () 는 허가를 방출합니다.예를 들어 Windows에서 공유 파일의 최대 클라이언트 액세스 개수를 설정할 수 있습니다.
Semaphore가 실현하는 기능은 화장실에 5개의 구덩이가 있는 것과 유사하다. 만약에 10명이 화장실에 가야 한다면 동시에 몇 명만 화장실에 갈 수 있을까?동시에 5명만 차지할 수 있고, 5명 중 한 명이 비켜서면 기다리는 5명 중 한 명이 차지할 수 있다.또한 기다리는 5명 중 무작위로 우선 기회를 얻을 수도 있고, 선착순으로 기회를 얻을 수도 있다. 이것은 Semaphore 대상을 구성할 때 전송되는 매개 변수 옵션에 달려 있다.단일 신호량의 Semaphore 대상은 서로 자물쇠를 밀어내는 기능을 실현할 수 있고 한 라인에서 자물쇠를 얻은 다음에 다른 라인에서 자물쇠를 방출할 수 있다. 이것은 자물쇠가 사라진 일부 장소에 응용할 수 있다.
코드 예제

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Semaphore; 
 
 
/** 
 * DateTime: 2015 1 1   6:41:01 
 * 
 */ 
public class SemaPhore { 
  public static void main(String[] args) { 
    //   
    ExecutorService exec = Executors.newCachedThreadPool(); 
    //  5  
    final Semaphore semp = new Semaphore(5); 
    //  20  
    for (int index = 0; index < 50; index++) { 
      final int NO = index; 
      Runnable run = new Runnable() { 
        public void run() { 
          try {<span id="transmark"></span> 
            //   
            semp.acquire(); 
            System.out.println("Accessing: " + NO); 
            Thread.sleep((long) (Math.random() * 6000)); 
            //  ,  
            semp.release(); 
            //availablePermits()  
            System.out.println("-----------------" + semp.availablePermits());  
          } catch (InterruptedException e) { 
            e.printStackTrace(); 
          } 
        } 
      }; 
      exec.execute(run); 
    } 
    //   
    exec.shutdown(); 
  } 
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기