티스토리 뷰

Java

[Java]ConcurrentLinkedQueue란?

Xion 2020. 5. 5. 21:10

java.util 에서 제공하는 Queue class는 멀티 스레드 환경에서 critical section에 대한 동기화가 적용되어 있지 않다.

즉 멀티 스레드 환경에서 Queue 객체를 사용하게 된다면 아래와 같은 코드에 문제가 발생한다.

 

queue.poll();

 

poll() 함수는 Queue 객체 맨 앞에 들어있는 data를 꺼내오는 동작을 수행한다.

개발자가 원하는 동작은 꺼내오는 동시에 data가 삭제되는 것이다.

 

즉, 다음번 poll() 함수에서는 다른 data를 꺼내오게 될 것을 기대한다.

 

하지만 멀티 스레드 환경에서는 이런 기대는 만족되지 않는다.

 

여러 스레드 중 2개나 3개의 스레드가 poll() 함수를 동일하게 수행하는 결과가 나타날 수 있기 때문이다.

만약 queue에 [“1”, “2”, “3”] 과 같이 데이터가 들어있다고 가정하자.

 

스레드 3개가 critical section에서 poll() 함수를 수행해 모두 “1”이라는 데이터를 가져오면 queue는 [“2”, “3”] 데이터를 가지게 된다.

 

이로써 개발자가 원한 동작은 수행되지 않고 예측하지 않은 동작이 수행돼 동작상에 에러가 발생할 수 있다.

 

멀티 스레드 환경에서 이러한 문제를 해결하기 위해 제공하는 Class가 바로 ConcurrentLinkedQueue이다.

큐가 비어있을 경우 null을 리턴한다.

 

 

사용예시

 

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();

//data를 offer 할 때
put: queue.offer(Data);


//data를 꺼낼 때
get: queue.poll();