Java Semaphore
Multi thread 환경에서 하나의 thread가 작업중에 다른 thread의 진입을 막기 위해 synchronized 키워드를 사용한다. 즉, synchronized는 한번에 하나의 thread가 작업을 할 수 있도록 해준다.
그러므로, Semaphore count를 1로 설정한 것은 synchronized와 같다고 볼 수 있다.
그러면 만약 10개의 thread가 있다고 가정했을때, 이중 3개씩만 동시 접근이 가능하도록 만들려면 어떻게 할까?
이럴때 Semaphore를 사용해 보자. 아래는 예제 코드.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | class SemaphoreTest { public static void main(String[] args) throws InterruptedException { List<Thread> threadList = new ArrayList<>(); final SomeResource resource = new SomeResource(3); Thread temp = null; for (int i = 0; i < 10; i++) { temp = new Thread(() -> resource.use()); threadList.add(temp); temp.start(); } for (Thread thread : threadList) { System.out.println("[" + thread.getName() + "] joining..."); thread.join(); } } private static class SomeResource { private final Semaphore semaphore; private final int maxThread; public SomeResource(int maxThread) { this.maxThread = maxThread; this.semaphore = new Semaphore(maxThread); } public void use() { try { semaphore.acquire(); System.out.println("[" + Thread.currentThread().getName() + "] spare: " + semaphore.availablePermits()); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } } } |
- 25 line: new Semaphore(thread 갯수)로 동시 접근 가능한 thread의 갯수를 정한다.
- 30 line: acquire()로 semaphore를 하나 얻으면 들어 올수 있는 thread count가 -1이 된다.
- thread count가 0이 되면 더 이상 thread가 진입하지 못한다.
- 38 line: release()로 semaphore를 풀면 thread count가 +1이 된다.
그러므로, Semaphore count를 1로 설정한 것은 synchronized와 같다고 볼 수 있다.
댓글
댓글 쓰기