JAVA/비동기 프로그래밍 14

[Netty] Netty 개요 및 간단한 예제

Netty비동기 이벤트 기반의 네트워크 애플리케이션 프레임워크HTTP뿐만 아니라 FTP, SMTP, Telnet 등 다양한 네트워크 프로토콜을 지원Java IO, NIO, Selector 기반으로 적은 리소스로 높은 성능 보장NIO는 비동기 I/O를 지원하여, 블로킹 방식의 IO에 비해 더 나은 성능을 제공NIO의 Selector는 여러 채널에서 발생하는 I/O 이벤트를 감지하고 처리불필요한 메모리 복사를 최소화하여 메모리 사용을 최적화 이벤트 모델은 매우 유연하고 확장 가능하며 필요에 따라 커스텀 이벤트 핸들러를 추가하거나 제거할 수 있음서버와 클라이언트 모두 지원하며 이를 통해 양방향 통신이 필요한 애플리케이션을 쉽게 개발할 수 있음  NIOEventLoopNetty 프레임워크에서 비동기 I/O 작업..

[Java] 자바 IO, NIO, AIO

자바 IO자바 1 버전에 최초 도입파일과 네트워크에 데이터를 읽고 쓸 수 있는 API 제공InputStream, OutputStream과 같이 byte 단위로 읽고 쓸 수 있는 streamblocking 방식으로 동작 1. InputStream바이트 스트림을 통해 데이터를 읽는 데 사용되는 추상 클래스Closable 구현체이기 때문에 명시적으로 스트림을 닫거나 try-with-resources 사용 가능파일, 네트워크 연결, 메모리 버퍼 등 다양한 소스로부터 데이터를 읽을 수 있는 표준화된 방법을 제공어떤 source로부터 데이터를 읽을지에 따라 다양한 구현체 존재FileInputStreamByteArrayInputStreamBufferedInputStreamSocketInputStream 1.1 주요 ..

[Java] CompletableFuture

동시성 프레임워크 정리 글에서 언급했다시피 Future는 작업의 결과를 가져올 때까지 blocking 되고, 작업을 조합하거나 예외 처리하는 것이 어려웠습니다.이 문제를 해결하기 위해 자바 8에서 CompletableFuture가 등장했고 이번 게시글에서는 다음 내용을 간단히 정리해 보겠습니다.동기 vs 비동기CompletableFuture 개요CompletableFuture APIForkJoinPool 1. 동기 vs 비동기 1.1 동기(Synchronous)작업이 순차적으로 실행되며 한 작업의 시작과 완료가 다른 작업의 시작과 완료와 밀접하게 연결된 방식하나의 작업이 실행 중인 동안 다른 작업은 대기해야 함작업의 결과를 기다린 후 다음 작업이 진행작업은 한 번에 하나씩 진행하며 작업을 건너뛰거나 빠뜨..

[Java] ThreadPoolExecutor

ThreadPoolExecutor는 ExecutorService를 구현한 클래스로서 매개변수를 통해 다양한 설정과 조정이 가능하며 사용자가 직접 컨트롤할 수 있는 쓰레드 풀입니다.기존의 Executors가 생성하는 ThreadPool은 옵션 세부 튜닝이 어려웠던 반면 ThreadPoolExecutor는 이를 보완함 ThreadPoolExecutor는 다양한 구성 옵션을 통해 동작을 조정할 수 있으며 주요 구성 요소는 다음과 같습니다.corePoolSizemaximumPoolSizekeepAliveTimeBlockingQueueRejectedExecutionHandlerThreadPoolExecutor Hook 1. corePoolSize & maximumPoolSizeThreadPoolExecutor는 ..

[Java] 자바 동시성 프레임워크

ThreadPool 다수의 쓰레드를 미리 생성하고 관리하여 작업을 효율적으로 처리하는 디자인 패턴 자바에서는 쓰레드 풀을 사용할 수 있도록 Executor 프레임워크 제공 1. ThreadPool이 필요한 이유 쓰레드 생성 비용 절감 쓰레드 재사용 동시성 제어 대량 요청으로부터 시스템 보호 1.1 쓰레드 생성 비용 절감 쓰레드 생성은 비싼 작업 따라서 쓰레드 풀은 쓰레드를 미리 생성하고 초기화하여 대기 상태로 유지함으로써 쓰레드 생성 비용을 절감시킴 1.2 쓰레드 재사용 쓰레드 풀은 작업이 종료된 쓰레드를 대기 상태로 전환시킨 뒤 재사용하며 반복적인 쓰레드 생성 및 삭제에 따른 오버헤드를 피하고 성능 향상 도모 1.3 동시성 제어 쓰레드 풀은 동시에 실행되는 쓰레드의 개수를 제어함에 따라 시스템 리소스의..

[Java] 동기화 도구

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2411 [Java] Lock, ReentrantLock, ReadWriteLock, ReentrantReadWriteLock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2409 [Java] synchronized, wait() & notify(), volatile, Deadlock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tist jaimemin.tistory.com CAS(Compare and Swap) 멀티 쓰레드 환경에서 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법 제공 CP..

[Java] Lock, ReentrantLock, ReadWriteLock, ReentrantReadWriteLock

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2409 [Java] synchronized, wait() & notify(), volatile, Deadlock 개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2392 [Java] 동기화 개념 1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로 jaimemin.tistory.com synchronized vs Lock 구현 Lock 구현은 synchronized 구문과 마찬가지로 상호 배제와 가시성 기능을 가진 동기화 기법 Lock 구현은 synchronized보다 더 확장된 락 작업 제공 tryL..

[Java] synchronized, wait() & notify(), volatile, Deadlock

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2392 [Java] 동기화 개념 1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로세스와 하나 이상의 쓰레드로 구성하는 멀티 쓰레드 프로세스로 구분할 수 있습니다,. 멀티 쓰레 jaimemin.tistory.com https://jaimemin.tistory.com/2406 [Java] 동기화 기법 개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드 jaimemin.tistory.com Syn..

[Java] 동기화 기법

개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드가 임계 영역에서 Mutex 객체의 flag를 소유해 락을 획득하면 다른 쓰레드가 접근할 수 없으며 Mutex 객체 flag가 해제 즉, 락이 해제되어야지만 타 쓰레드가 임계 영역에 접근 가능 정리하자면 Mutex 락을 가진 오직 한 개의 쓰레드만이 임계 영역에 진입할 수 있으며 락을 획득한 쓰레드만이 락 해제 가능 코드 부연 설명 임계 영역을 점유하고 있는 쓰레드가 없을 경우 lock은 false lock이 false인 상태에서 쓰레드가 임계 영역에 접근하고자 acquired() 메서드를 호..

[Java] 동기화 개념

1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로세스와 하나 이상의 쓰레드로 구성하는 멀티 쓰레드 프로세스로 구분할 수 있습니다,. 멀티 쓰레드가 항상 좋은 것은 아니며, 자원을 효율적으로 활용하고 성능을 고려한 후에 적절한 방식을 선택해야 합니다. 현재 시중에 나온 CPU는 대부분 멀티코어를 지원하기 때문에 병렬적 성능 및 동시적 자원을 사용하는 관점에서는 대부분 멀티 쓰레드 기반 프로그래밍이 유리한 것은 맞으나 비동기 논블로킹 프로그래밍 같이 싱글 쓰레드 혹은 적은 쓰레드를 활용하는 것이 좋은 성능 및 응답성을 보여줄 수도 있음 1.1 싱글 쓰레드 장점 context switching으로 인한 딜레이가 없음 동시성 문제없음 자원을 적게 사용 앞서 언급한..