카샤의 만개시기

동기화 클래스 1편 - 세마포어(Semaphore) 본문

Java/POJO

동기화 클래스 1편 - 세마포어(Semaphore)

SKaSha 2019. 7. 3. 15:53

리소스에 접근할 수 있는 스레드의 수를 제한할 때 사용합니다.

acquire() 메소드를 통하여 접근 권한을 퍼밋(Permit)받고, 남은 퍼밋이 없을 경우 퍼밋이 생기거나 인터럽트가 발생되거나 타임아웃이 걸리지 전까지 대기합니다.
release() 메소드는 확보했던 퍼밋을 다시 세마포어에게 돌려주는 메소드입니다.

세마포어에 대해서 자세히 알고 싶다면 다음 글을 참고해주세요
세마포어(Semaphore)와 뮤텍스(Mutex)

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(); // 세마포어 리소스 확보
        try {
            doUse();
        } finally {
            semaphore.release(); // 세마포어 리소스 해제
        }
    }

    protected void doUse() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + " / Finish Time : " + System.currentTimeMillis() + " / available resource count = " + (MAX_PERMIT_CNT - semaphore.availablePermits()));
    }
}

class UserThread extends Thread {
    private final ShareResource resource;

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

    public void run() {
        try {
            while (true) {
                resource.use();
                Thread.sleep(5000);
            }
        } catch (InterruptedException e) {}
    }
}

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

Next

동기화 클래스 2편 - CountDownLatch

Comments