신 호 량 메커니즘 Semaphore

운영 체제 의 신 호 량 은 매우 중요 한 개념 으로 프로 세 스 제어 에 있어 모두 응용 된다. Java 동시 다발 창고Semaphore 신 호 량 통 제 를 쉽게 완성 할 수 있 습 니 다. Semaphore 는 특정한 자원 이 동시에 방문 할 수 있 는 개 수 를 제어 할 수 있 습 니 다. acquire () 는 허 가 를 받 고 없 으 면 기다 리 고 release () 는 허 가 를 내 립 니 다.예 를 들 어 윈도 에서 공유 파일 의 최대 클 라 이언 트 접근 개 수 를 설정 할 수 있 습 니 다.
Semaphore 는 현재 방문 의 개 수 를 유지 하고 동기 화 메커니즘 을 제공 하 며 동시에 방문 하 는 개 수 를 제어 합 니 다.데이터 구조 에서 링크 는 '무한' 노드 를 저장 할 수 있 고 Semaphore 로 유한 한 크기 의 링크 를 실현 할 수 있 습 니 다.또한 잠 금 ReentrantLock 에 다시 들 어가 도 이 기능 을 실현 할 수 있 지만 실현 에 있어 서 는 책임 을 져 야 하고 코드 도 복잡 해 야 합 니 다.
아래 데모 에 서 는 5 개의 허 가 를 받 은 Semaphore 가 있 고 20 개의 스 레 드 가 이 자원 에 접근 할 것 이 라 고 밝 혔 습 니 다. acquire () 와 release () 를 통 해 방문 허 가 를 받 고 방출 합 니 다.package concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestSemaphore {
  public static void main(String[] args) {
    // 
    ExecutorService exec = Executors.newCachedThreadPool();
    //  5
    final Semaphore semp = new Semaphore(5);
    //  20
    for (int index = 0; index < 20; index++) {
      final int NO = index;
      Runnable run = new Runnable() {
        public void run() {
          try {
            // 
            semp.acquire();
            System.out.println("Accessing: " + NO);
            Thread.sleep((long) (Math.random() 10000));
            //  ,
            semp.release();
          catch (InterruptedException e) {
          }
        }
      };
      exec.execute(run);
    }
    // 
    exec.shutdown();
  }
}

실행 결과: 액세스: 0 액세스: 1A 액세스: 2Accessing: 3... 액세스: 17 액세스: 18 액세스: 19

좋은 웹페이지 즐겨찾기