Java 1.0~1.4: 초기 스레드 모델
- Thread 클래스와 Runnable 인터페이스 도입
- 기본적인 스레드 생성 및 실행 메커니즘이 제공됨.
synchronized
,wait()
,notify()
,notifyAll()
메서드를 사용한 동기화가 가능.
- 초기 문제점
- 동기화 블록의 관리가 어려움.
- 스레드 풀과 같은 고급 API 부재.
- 비효율적인 스레드 관리.
Java 5 (2004): java.util.concurrent
패키지 도입
새로운 기능
Executor Framework
스레드 관리를 단순화하는 스레드 풀 및 작업 실행 프레임워크.
ExecutorService executor = Executors.newFixedThreadPool(4); executor.execute(() -> System.out.println("Task running")); executor.shutdown();
ReentrantLock
더 유연한 락 메커니즘 제공 (재진입 가능).
ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 임계 영역 } finally { lock.unlock(); }
Callable
및Future
반환값을 갖는 작업을 비동기적으로 실행 가능.
Future<Integer> result = executor.submit(() -> 42); System.out.println(result.get()); // 42
CountDownLatch
,Semaphore
,CyclicBarrier
등- 스레드 간의 조율 및 동기화를 위한 고급 유틸리티.
BlockingQueue
- Thread-Safe 제공.
Java 7 (2011): Fork/Join Framework
새로운 기능
Fork/Join Framework
작업을 작은 단위로 나누어 병렬 처리를 지원. CPU 코어를 최대한 활용.
ForkJoinPool pool = new ForkJoinPool(); pool.invoke(new RecursiveTaskExample());
Phaser
- 스레드 동기화를 위한 새로운 동기화 클래스.
CyclicBarrier
와CountDownLatch
의 장점을 결합.
TransferQueue
및 기타 동시성 데이터 구조 개선- 생산자-소비자 패턴을 효율적으로 지원.
Java 8 (2014): CompletableFuture
새로운 기능
CompletableFuture
비동기 작업을 더욱 간편하게 작성할 수 있도록 개선된 API.
CompletableFuture.supplyAsync(() -> "Hello") .thenApply(result -> result + " World") .thenAccept(System.out::println); // Hello World
콜백 스타일의 비동기 작업 지원.
조합 및 체인 작업 가능.
Lambda와 Stream API
- 멀티스레드 환경에서
parallelStream
을 사용해 데이터 병렬 처리 가능.
- 멀티스레드 환경에서
Java 9 (2017): Reactive Streams
새로운 기능
java.util.concurrent.Flow
API- 리액티브 프로그래밍을 위한 인터페이스 제공.
Publisher
,Subscriber
,Processor
와 같은 컴포넌트 정의.
Immutable Collections
멀티스레드 환경에서 안전한 불변 컬렉션 생성 메서드 추가.
Java 11 (2018): Enhancements
CompletableFuture
개선타임아웃과 관련된 API 추가 (
orTimeout
,completeOnTimeout
).future.orTimeout(1, TimeUnit.SECONDS);
동시성 관련 성능 최적화
- JVM 수준에서의 병렬 처리와 스레드 관리 효율성 향상.
Java 19 (2022): Virtual Threads (Project Loom, 미리보기 기능)
Virtual Threads:경량 스레드 지원으로, 수천 개의 스레드를 생성해도 효율적으로 작동.
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> System.out.println("Running in a virtual thread")); }
- 기존 OS 스레드 기반의 한계를 극복.
- 비동기 작업의 코드 복잡도를 대폭 줄임.
Java 21 (2023): Virtual Threads 정식 도입
Virtual Threads 정식 기능
- 멀티스레드 프로그래밍의 표준으로 자리 잡음.
- 블로킹 코드도 Virtual Thread를 통해 효율적으로 실행 가능.
Structured Concurrency API
여러 스레드를 함께 관리할 수 있는 새로운 API.
try (var scope = StructuredTaskScope.open()) { scope.fork(() -> fetchData()); scope.join(); }
'WEB BE > JAVA' 카테고리의 다른 글
[Test] LocalDateTime 을 사용하는 함수의 테스팅 방법 (0) | 2024.10.13 |
---|