멀티 스레드 환경에서 Queue는 생산 및 소비의 구조에 필수적인 자료구조이다.
여기서 우리는 BlockingQueue라는 interface를 구현한 객체를 가져다 쓸 수 있다.
Block 이라는 것은 먼저 무엇일까? '막는다'는 뜻이다.
Queue가 꽉찼을때의 삽입 시도 / Queue가 비어있을때의 추출 시도를 막는 다는 것이다.
이 자동으로 '막는' 기능이 있어 BlockingQueue 의 구현체는 모두 Thread-safe 하다.
BlockingQueue의 종류
1) ArrayBlockingQueue
배열로 구현된 큐로 생성시 최대 크기를 인자로 준다.
선택적으로 공평성 정책을 두어 block된 thread들의 순차적 대기열 생성
대기열의 순서는 보장되지 않지만 공평성을 따지기 때문에 특정 thread의 기아현상을 줄인다.
다만 그때문에 처리율이 다소 감소하는 면이 있다.
참고로 큐에 데이터를 삽입하는 메소드로 add와 put이 있는데, add는 큐 최대 크기를 따지지 않고 삽입하기 때문에 Exception이 발생할 여지가 있지만, put은 최대 크기를 따져 더이상 삽입하지 못하는 상태라면(큐가 가득차있다면) 삽입하지 않고 기다리기때문에(Block되기 떄문에) 안전하다.
2) LinkedBlockingQueue
LinkedList로 구현되있고 크기를 지정하지 않아도 동적으로 크기가 조절된다.
하나의 큐에 대해 동시 사용이 높은 환경에서 ArrayBlockingQueue보다 높은 처리율을 보인다.
3) PriorityBlockingQueue
PriorityQueue와 같은 정렬방식을 갖고있다.
입력무제한(unbounded)으로 기본 설계가 되었기 때문에 추가작업 수행중 fail이 나면 이것은 자원고갈이 났다는 뜻이다.(OutOfMemoryError 발생)
'Back-End > Java' 카테고리의 다른 글
java 라이브러리를 사용하는 소스 컴파일 및 실행 방법 (0) | 2018.09.17 |
---|---|
Java IDE없이 기본 프로젝트 환경 구성하기 (0) | 2018.09.17 |
Java Synthetic class (0) | 2018.09.17 |
Java Dynamic Proxy (0) | 2018.09.17 |
자바의 인자 전달 방식은 Call by value다. (0) | 2018.09.17 |