[JAVA8 병렬프로그래밍] 컨커런트 API
- Coding/Java
- 2022. 6. 14.
컨터런트 API
자바 5에서 처음 소개한 컨커런트 API는 스레드에서 데이터 정합성을 확보하고 멀티 스레드 환경에서 프로그래밍하기 위해 필요한 5가지 특징이 있다.
- 병렬 애플리케이션에서 데이터의 동기화와 정합성을 확보하기 위해 Lock 객체를 제공하며 이를 통해 잠금 기능을 사용할 수 있다.
- 스레드를 실행하고 관리하는 고수준 API를 사용한 Executors 클래스를 제공한다. 이 클래스는 Executor 인터페이스를 구현한 것으로 대량 데이터를 병렬 처리하기에 적합하다.
- 병렬 프로그램에서 대량 데이터의 정합성을 유지한채 사용하기 위한 컬렉션 프레임워크의 확장판인 컨커런트 컬렉션 클래스를 제공한다.
- 원자적 변수는 동기화를 위한 synchronized 키워드 사용을 최소화하여 성능을 확보하면서 메모리 정합성(Memory consistency) 에러를 방지하는 기능을 제공한다.
- ThreadLocalRandom 클래스를 이용해서 멀티 스레드 환경에서 효율적인 난수를 생성하는 기능을 제공한다.
컨커런트 API의 패키지 3가지
패키지명 | 설명 |
java.util.concurrent | - 컨커런트 프로그래밍에서 가장 많이 사용하는 유틸리티 클래스가 포함된 패키지다. - 비동기 태스크 실행과 스레드의 생성-관리를 위한 다양한 인터페이스와 클래스가 제공된다. |
java.util.concurrent.atomic | - 병렬 프로그래밍에서 데이터에 대한 정합성을 확보하기 위하여 원자적 변수 선언 기능을 제공하는 패키지다. |
java.util.concurrent.locks | - 컨커런트 API에서 객체에 대한 잠금, 대기 기능을 제공하는 유틸리티 클래스와 인터페이스를 제공한다. |
컨커런트 API 패키지
실행자 (Executors)
컨커런트 API에서 작업을 실행하는 역할을 하며 인터페이스와 인터페이스를 구현한 클래스로 구성되어있다. Executor 인터페이스를 사용하면 비동기 처리, 스레드 풀, 태스크 프레임워크 등을 쉽게 구현할 수 있다.
- 새로운 스레드를 생성한다.
- 기존에 생성된 스레드를 재활용한다.
- 작업을 순차적 또는 병렬적으로 실행시킨다.
- 추가적으로 스케줄링이 가능해서 주기적으로 작업을 실행시킨다.
- 현재가 아닌 미래의 특정 시점에 작업을 실행시킨다.
큐 (Queues)
큐는 컬렉션 프레임워크에서 제공하는 선입선출(FIFO) 방식의 데이터 처리 흐름이다.
컨커런트 API에서 추가로 제공하는 큐는 멀티 스레드 환경에서 안정성을 보장한다.
타이밍 (Timing)
멀티 스레드 프로그래밍에서 소프트웨어의 안전성을 확보하기 위해서는 스레드를 잘 실행하고 종료해서 한정된 자원을 최대한 효율적으로 활용해야한다. 타임아웃 기능을 통해 불필요한 스레드 등을 관리한다.
동기화 (Synchronizers)
컨커런트 API에서는 동기화와 관련된 5가지 유형의 유틸리티를 제공한다. Semaphore 클래스를 사용하여 쉽게 구현이 가능하고 이외에도 여러 유틸리티 클래스를 이용해서 동기화를 제어할 수 있다.
컨커런트 컬렉션 (Concurrent Collections)
이 클래스는 위에 언급한 큐와 달리 컨커런트 API 환경에서 List 혹은 Map형 데이터를 다루기 위해 제공하는 인터페이스와 클래스들이다. 이 컨커런트 컬렉션 클래스는 멀티 스레드에 안전할 뿐만 아니라 멀티 스레드 환경에서 더 좋은 성능을 발휘한다. 만일 컬렉션 데이터의 업데이트 혹은 삭제 작업 등이 많다면 전통적으로 사용하는 HashMap, ArrayList 보다 컨커런트 컬렉션에서 제공하는 것을 사용하는 것이 좋다. 컨커런트 컬렉션은 동시 처리를 보장하도록 설계되어있다.
메모리 정합성 관련 속성 (Memory Consistency Properties)
자바 언어 스펙을 보면 공유되는 변수의 값에 대해서 멀티 스레드가 읽고 쓰기를 할때 데이터의 정합성을 보장하기 위해서 synchronized나 volatile 키워드로 보호해야 한다고 기술하고 있다. 컨커런트 API에서 이를 회피하기 위해 제공하는 기능이 존재한다.
'Coding > Java' 카테고리의 다른 글
[JAVA8 병렬프로그래밍] 포크/조인 프레임워크 (0) | 2022.06.15 |
---|---|
[JAVA8 병렬프로그래밍] Executors 클래스, ExecutorService 인터페이스 (1) | 2022.06.14 |
[Java] Stream 사용하여 String 이 null이 아닐 경우 concat(joining) 수행하기 (0) | 2022.03.23 |
익명클래스 vs 람다식 비교 (0) | 2022.01.25 |
JVM GC (Garbage Collection) 에 대한 정리 (2) | 2022.01.16 |