"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 세마포어를 사용하여 Java에서 동시성을 관리하는 기술

세마포어를 사용하여 Java에서 동시성을 관리하는 기술

2024-11-09에 게시됨
검색:610

1. Java의 세마포어란 무엇입니까?

Techniques for Managing Concurrency in Java Using Semaphores

Java의 세마포어는 언제든지 공유 리소스에 액세스할 수 있는 스레드 수를 제한하는 동기화 보조 장치입니다. 이는 java.util.concurrent 패키지의 일부이며 파일, 데이터베이스 또는 네트워크 연결과 같은 리소스에 대한 동시 액세스를 관리하는 데 사용됩니다.

1.1 세마포어는 어떻게 작동하는가?

Techniques for Managing Concurrency in Java Using Semaphores

세마포어는 설정된 수의 허가에 대한 액세스를 제어합니다. 각 허가는 특정 리소스에 액세스할 수 있는 권한을 나타냅니다. 세마포어는 사용 가능한 허가 수를 추적하여 동시에 리소스에 액세스할 수 있는 스레드 수를 결정합니다.

허가 : 스레드가 공유 리소스에 대한 액세스를 계속할 수 있도록 허용하는 토큰 또는 티켓입니다.

세마포어를 생성할 때 사용 가능한 허가 수를 지정합니다. 이 숫자는 동시에 리소스에 액세스할 수 있는 스레드 수를 정의합니다.

스레드가 리소스에 액세스하려면 먼저 세마포어로부터 허가를 받아야 합니다. 이는 acquire() 메서드를 사용하여 수행됩니다.

Acquire : 이 메서드는 스레드가 리소스에 액세스하려고 할 때 호출됩니다. 허가를 사용할 수 있는 경우 세마포어는 사용 가능한 허가 수를 줄이고 스레드가 계속 진행되도록 허용합니다. 사용 가능한 허가가 없으면 허가를 사용할 수 있을 때까지 스레드가 차단됩니다.

차단 동작 : 사용 가능한 허가가 없으면 acquire()를 호출하는 스레드는 다른 스레드가 허가를 해제할 때까지 차단됩니다(즉, 대기합니다).

스레드가 리소스 사용을 마치면 다른 스레드에서 사용할 수 있도록 허가를 해제해야 합니다. 이는 release() 메서드를 사용하여 수행됩니다.

Release : 이 방법은 사용 가능한 허가 수를 증가시킵니다. 허가를 기다리는 스레드가 있으면 그 중 하나가 차단 해제되고 허가를 획득할 수 있습니다.

1.2 세마포어의 종류

자바에는 두 가지 유형의 세마포가 있습니다.

  • 세마포 계산 : 이 유형의 세마포를 사용하면 설정된 수의 스레드가 리소스에 액세스할 수 있습니다. 예를 들어 세마포어를 3으로 설정하면 동시에 3개의 스레드만 리소스에 접근할 수 있습니다.
  • 이진 세마포어(Mutex): 이는 허용 수가 1개인 세마포어를 계산하는 특별한 경우로, 한 번에 하나의 스레드만 리소스에 액세스할 수 있도록 허용합니다. 상호 배제 잠금(뮤텍스)으로 자주 사용됩니다.

2. 자바에서 세마포어 구현하기

세마포어 작동 방식을 더 잘 이해하기 위해 실제 구현을 살펴보겠습니다. 여러 스레드가 제한된 리소스에 액세스하려고 시도하는 간단한 시나리오를 만들어 보겠습니다.

2.1 환경 설정

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    // Creating a semaphore with 3 permits
    private static final Semaphore semaphore = new Semaphore(3);

    public static void main(String[] args) {
        // Creating and starting 6 threads
        for (int i = 1; i 



2.2 코드 설명

이 예에서는 3개의 허가가 있는 세마포어를 생성합니다. 즉, 주어진 시간에 3개의 스레드만 코드의 중요 섹션에 액세스할 수 있다는 의미입니다. 그런 다음 6개의 스레드를 생성하고 모두 허가를 얻으려고 시도합니다. 스레드가 허가를 획득하면 허가를 해제하기 전에 2초 동안 휴면하여 일부 작업을 시뮬레이션합니다.

2.3 출력 관찰

위 코드를 실행하면 출력은 다음과 같습니다.

Worker 1 is trying to acquire a permit...
Worker 1 acquired a permit.
Worker 2 is trying to acquire a permit...
Worker 2 acquired a permit.
Worker 3 is trying to acquire a permit...
Worker 3 acquired a permit.
Worker 4 is trying to acquire a permit...
Worker 5 is trying to acquire a permit...
Worker 6 is trying to acquire a permit...
Worker 1 is releasing a permit.
Worker 4 acquired a permit.
Worker 2 is releasing a permit.
Worker 5 acquired a permit.
Worker 3 is releasing a permit.
Worker 6 acquired a permit.

여기서 처음 세 스레드는 성공적으로 허가를 획득하고 작업을 시작합니다. 나머지 스레드는 허가가 해제될 때까지 기다려야 계속 진행할 수 있습니다.

2.4 실제 사용 사례

세마포는 다음과 같이 특정 리소스에 대한 동시 액세스 수를 제한해야 하는 시나리오에서 특히 유용합니다.

    데이터베이스 연결 제한
  • 공유 파일에 대한 액세스 제어
  • 서버에서 네트워크 연결 관리
3. 세마포어 사용의 장점과 단점

세마포어는 강력한 도구이지만 고유한 장점과 단점도 있습니다.

3.1 장점

유연성 : 세마포어를 사용하면 여러 스레드의 리소스 액세스를 정확하게 제어할 수 있습니다.

확장성 : 세마포어는 수많은 리소스에 대한 액세스를 쉽게 관리할 수 있습니다.

공정성 : 스레드가 공정한 방식으로 허가를 획득하도록 세마포어를 구성할 수 있습니다.

3.2 단점

복잡성 : 세마포어를 사용하면 코드가 복잡해져서 디버깅이 더 어려워질 수 있습니다.

교착 상태 : 올바르게 처리되지 않으면 세마포어는 스레드가 허가를 기다리며 무기한 차단되는 교착 상태로 이어질 수 있습니다.

4. Java에서 세마포어 사용에 대한 모범 사례

일반적인 함정을 피하고 세마포어를 최대한 활용하려면 다음 모범 사례를 고려하세요.

4.1 시간 제한 획득을 위해 tryAcquire 사용

무기한 차단하는 acquire() 대신 tryAcquire()를 사용하여 시간 초과로 허가 획득을 시도할 수 있습니다. 이렇게 하면 스레드가 기다리다가 멈추는 것을 방지할 수 있습니다.


if(semaphore.tryAcquire(1000, TimeUnit.MILLISECONDS)) { 노력하다 { // 크리티컬 섹션 } 마지막으로 { semaphore.release(); } }
if(semaphore.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
    try {
        // Critical section
    } finally {
        semaphore.release();
    }
}
4.2 finally 블록에서는 항상 허가를 해제하세요.

리소스 누출을 방지하려면 항상

finally 블록에서 허가를 해제하세요. 이렇게 하면 예외가 발생하더라도 허가가 해제됩니다.

4.3 단순 잠금에 세마포어 사용을 피하세요

단일 스레드에 대한 리소스만 잠그거나 잠금 해제해야 하는 경우 바이너리 세마포어 대신 ReentrantLock 또는 동기화 사용을 고려하세요.

5. 결론

세마포어는 Java에서 동시성을 관리하기 위한 강력한 도구로, 공유 리소스에 액세스하는 스레드 수를 제어할 수 있습니다. 이 기사에 설명된 기술과 모범 사례를 따르면 Java 애플리케이션에서 세마포어를 효과적으로 구현하여 안전하고 효율적인 리소스 관리를 보장할 수 있습니다.

질문이 있거나 세마포어에 대한 자신의 경험을 공유하고 싶다면 아래에 자유롭게 의견을 남겨주세요!

에서 자세한 게시물 읽기: 세마포어를 사용하여 Java에서 동시성을 관리하는 기술

릴리스 선언문 이 기사는 https://dev.to/anh_trntun_4732cf3d299/techniques-for-managing-concurrency-in-java-using-semaphores-5ai?1에 복제되어 있습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다. 그것
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3