>Java >java지도 시간 >Java 함수 동시성 및 멀티스레딩에서 세마포어의 역할은 무엇입니까?

Java 함수 동시성 및 멀티스레딩에서 세마포어의 역할은 무엇입니까?

WBOY
WBOY원래의
2024-04-27 12:18:011008검색

세마포어는 Java 동시 프로그래밍에서 다중 스레드 리소스 액세스를 제어하는 ​​메커니즘입니다. 라이센스 수는 초기화 중에 스레드가 동시에 액세스할 수 있는 보호 리소스 수를 나타냅니다. 스레드가 리소스에 액세스하려고 하면 라이센스 얻기를 시도합니다. 사용 가능한 라이센스가 없으면 라이센스를 사용할 수 있을 때까지 스레드가 차단됩니다.

Java 함수 동시성 및 멀티스레딩에서 세마포어의 역할은 무엇입니까?

Java 함수 동시성 및 멀티스레딩에서 세마포어의 역할

세마포어는 Java 동시 프로그래밍의 중요한 메커니즘으로, 멀티스레드 시나리오에서 리소스 액세스를 제어하는 ​​데 사용됩니다. 리소스를 보호하는 공유 데이터 구조에 대한 라이선스를 생성하여 이를 수행합니다.

작동 방식

세마포는 초기화 시 라이센스 수를 지정합니다. 이는 보호된 리소스에 동시에 액세스할 수 있는 최대 스레드 수를 나타냅니다. 스레드가 리소스에 액세스하려고 하면 세마포어에 대한 라이센스를 얻으려고 시도합니다. 사용 가능한 경우 라이센스가 부여되고 스레드가 리소스에 액세스할 수 있습니다. 사용 가능한 라이센스가 없으면 라이센스를 사용할 수 있을 때까지 스레드가 차단됩니다.

실용 사례

공유 리소스, 즉 대기열이 있다고 가정합니다. 동시에 5개의 스레드만 대기열에 액세스할 수 있습니다. 이를 보장하기 위해 세마포어를 사용할 수 있습니다.

import java.util.concurrent.Semaphore;
import java.util.Queue;

public class Example {
    private static final int MAX_ACCESS_COUNT = 5;
    private static Semaphore semaphore = new Semaphore(MAX_ACCESS_COUNT);
    private static Queue<Integer> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> accessQueue()).start();
        }
    }

    private static void accessQueue() {
        try {
            // 尝试获取一个许可证
            semaphore.acquire();

            // 访问队列
            queue.add((int) (Math.random() * 100));

            // 释放许可证
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

이 예에서 세마포어는 5개의 라이선스로 초기화됩니다. 이렇게 하면 최대 5개의 스레드만 동시에 대기열에 액세스할 수 있습니다. 라이센스를 사용할 수 있을 때까지 다른 스레드는 차단됩니다.

결론

세마포어는 공유 리소스에 대한 동시 액세스를 제어하는 ​​데 매우 유용합니다. 동시에 리소스에 액세스할 수 있는 스레드 수를 제한하여 데이터 경합 및 불일치를 방지하는 데 도움이 됩니다.

위 내용은 Java 함수 동시성 및 멀티스레딩에서 세마포어의 역할은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.