멀티 프로세스 환경에서 공유자원에 접근할 수 있는 스레드 숫자를 정하여 자원관리를 하게 해주는 동기화 기법이다.
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();
}
}
}