자바로 간단하게 세마포어를 사용해보자!

kihoo_ni·2024년 4월 7일

세마포어란?

멀티 프로세스 환경에서 공유자원에 접근할 수 있는 스레드 숫자를 정하여 자원관리를 하게 해주는 동기화 기법이다.

다음 예제를 통해 알아보자!

	package com.nhnacademy.semaphore;

import java.util.concurrent.Semaphore;

class ShareResource {
    // 세마포어 클래스 변수
    private final Semaphore semaphore;

    // 최대 허용인원 수
    private final int MAX_PERMIT_CNT;

    public ShareResource(int cnt) {
        this.semaphore = new Semaphore(cnt);
        this.MAX_PERMIT_CNT = cnt;
    }

    public void use() throws InterruptedException {
        semaphore.acquire(); // 세마포어 리소스 확보
        System.out.println("acquire");
        try {
            doUse();
        } finally {
            semaphore.release(); // 세마포어 리소스 해제
        }
    }

    // 현재 어떤 스레드가 이용중인지 보여줌
    protected void doUse() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println("douse");
        System.out.println("현재 스레드: " + Thread.currentThread().getName()
                + " / 현재 이용중인 스레드 수  = " + (MAX_PERMIT_CNT - semaphore.availablePermits()));
    }
}

class UserThread extends Thread {
    // 공유자원 클래스 변수
    private final ShareResource resource;

    public UserThread(ShareResource resource) {
        this.resource = resource;
    }

    // 스레드 start!
    public void run() {
        try {
            while (true) {
                resource.use();
                Thread.sleep(5000);
            }
        } catch (InterruptedException e) {
        }
    }
}

public class semaphore {
    public static void main(String[] args) {
        ShareResource resource = new ShareResource(3);
        // 10개의 쓰레드가 실행되지만 동시에 리소스에 접근 할 수 있는 쓰레드는 총 3개
        for (int i = 0; i < 10; i++) {
            new UserThread(resource).start();
        }
    }
}

0개의 댓글