Java Semaphore

Multi thread 환경에서 하나의 thread가 작업중에 다른 thread의 진입을 막기 위해 synchronized 키워드를 사용한다. 즉, synchronized는 한번에 하나의 thread가 작업을 할 수 있도록 해준다.

그러면 만약 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와 같다고 볼 수 있다.

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명