Java의 동시 대기열 구현
![Java의 동시 대기열 구현](/img/Java/ag-feature-image---concurrent-queue-java.webp)
이 기사에서는 Java에서 가장 효과적인 동시 대기열 구현과 활용해야 하는 대기열에 대해 설명합니다.
Java의 동시 대기열
먼저 세 가지 대기열을 모두 살펴보겠습니다.
자바 ConcurrentLinkedQueue
ConcurrentLinkedQueue
에는 잠금 기능이 내장되어 있지 않습니다. 이것의 직접적인 결과로 추가 및 폴링이 스레드로부터 안전하고 즉시 반환되도록 보장되는 대기 없는 기술을 제공합니다.
클라이언트가 무한 루프에서 대기하는 경우 어떤 옵션을 선택하든 최상의 대안으로 차단 대기열을 선택해야 합니다. 또한 wait-free 방식은 다른 스레드를 차단하지 않고 사용할 수 있습니다.
CAS 또는 Compare-And-Swap이 이 대기열의 잠금 대신 활용되고 있습니다. 이러한 시스템은 데이터 구조 차단을 허용하지 않으며 이 방법을 사용하면 많은 이점을 얻을 수 있기 때문에 최신 반응형 시스템에 탁월한 선택입니다.
자바 ArrayBlockingQueue
내부적으로 이 대기열은 배열을 사용합니다. 결과는 크기가 미리 결정된 제한된 대기열입니다.
ArrayBlockingQueue
의 put
및 take
작업은 동일한 잠금을 공유합니다. 성능 적중은 어떤 항목도 덮어쓰지 않는다는 확신을 줄 가치가 있습니다.
특히 대기열은 어레이를 사용하기 전에 미리 할당합니다. 전체적으로 증가할 수 있지만 너무 많은 메모리를 사용할 수도 있습니다.
그러한 용도 중 하나는 간단한 작업 대기열입니다. 이런 상황에서 소수의 고객을 완성하기 위해 많은 직원을 두는 것이 일반적입니다.
이 대기열의 크기는 제한되어 있으므로 메모리 제약이 있는 경우 버퍼 영역을 제공합니다. 한 가지 예는 대용량 대기열이 비어 있는 오랜 기간 동안의 가능성입니다.
공정성 정책은 잠금 구현이 스레드 순서를 합리적으로 유지함을 의미합니다. 스레드 A가 잠금 획득 단계에 먼저 진입하고 스레드 B가 진입하면 스레드 A가 잠금을 획득합니다.
정의가 없으면 결과가 불분명합니다. 다음 스레드 이후에 예약될 가능성이 높습니다.
자바 LinkedBlockingQueue
LinkedBlockingQueue
의 각 항목은 대기열에서 사용하는 LinkedList 변형의 새 노드로 표시됩니다.
LinkedBlockingQueue’의 성능은 실행마다 크게 다릅니다. 즉 말하자면; 우리는 가장 적절한 데이터 구조를 사용하고 있음을 보장하기 위해 지속적으로 상황을 프로파일링해야 합니다.
Java에서 구현하기에 가장 좋은 대기열
대기열에서 항목이 추가되거나 철회될 때마다 LinkedBlockingQueue
는 노드 할당 및 할당 해제를 수행해야 합니다. 따라서 대기열이 빠르게 증가하고 감소하는 경우 ArrayBlockingQueue
가 바람직할 수 있습니다.
ArrayBlockingQueue
의 크기는 항상 동일합니다. 용량이 10인 11번째 항목을 추가하면 기존 스레드가 항목을 삭제할 때까지 insert
문이 중단됩니다.
많은 스레드가 대기열에서 항목을 동시에 추가 및 삭제하려고 시도하면(대기열을 사용할 수 없을 때) 공정성 문제가 발생합니다. 공정성 메커니즘 덕분에 무엇이든 요청하는 첫 번째 스레드가 항상 가장 먼저 가져옵니다.
이것이 없으면 한 스레드의 대기 시간이 다른 스레드의 대기 시간보다 훨씬 길어 예기치 않은 동작이 발생할 수 있습니다. 그러나 공정성을 관리하는 부담은 처리량을 감소시킬 것입니다.
그러나 선택은 차단이 필요한지 여부에 달려 있습니다. 공급자는 많은데 구매자는 한 명뿐인 상황처럼 들린다.
소비자는 많지만 생산자는 하나뿐인 경우 차단 동작이 필요하지 않을 수 있습니다. 이 경우 소비자는 대기열이 비어 있는지 확인하고 비어 있으면 진행할 수 있습니다.
Java에서 ArrayBlockingQueue
구현
ArrayBlockingQueue
구현은 single-lock
이중 조건 기술을 활용합니다. 그것의 생성자 하나는 기본 데이터 구조인 Array와 LinkedList를 각각 가지고 있습니다.
다음은 ArrayBlockingQueue
의 생성자입니다.
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity < = 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn