Java
-
[Coroutine] 코루틴 학습 - 1 (Coroutine?)Java/Kotlin 2022. 4. 16. 16:47
Coroutine? JVM에서 병렬 처리를 위해서 이미 RxJava, Reactor, 자바에서 지원하는 Multithreading 등 유용한 도구들이 많이 있습니다. 많은 사람들이 비동기 처리를 위해 콜백 패턴을 활용하기도 합니다. 효율적인 비동기 처리를 위한 옵션들이 이미 많이 있는 상황에서 코루틴은 어떤 차별점을 가지고 있을까요? 먼저 앞서 소개한 도구들에 대해서 정리해 보겠습니다. Multi-thread 앞서 소개한 도구들은 병렬 처리를 위해 쓰레드를 생성하고, 연산을 위한 쓰레드 스위칭이 필요합니다. 쓰레드를 생성하는 일은 많은 비용을 초래합니다. 쓰레드를 취소하기 위한 메커니즘이 존재하지 않습니다. 이는 메모리 누수 문제로 이어질 수 있습니다. 잦은 쓰레드 스위칭은 제어하기 어렵습니다. 코드량이..
-
[Java] volatile keywordJava 2021. 3. 7. 18:22
Java에서 volatile 키워드는 자바 변수가 컴퓨터 CPU Cache가 아닌, 메인 메모리에서 읽어올 수 있도록 합니다. 즉, volatile 키워드가 붙은 변수는 오직 메인 메모리에서만 데이터를 읽고 쓰게 되는 것입니다. 이제부터 멀티쓰레드 환경에서 volatile 키워드가 가지는 의미에 대해서 알아보겠습니다. 변수 가시성 문제 멀티쓰레드 어플리케이션에서 각 쓰레드들이 non-volatile 변수들이 데이터에 접근할 때는 성능상의 이유로 메인 메모리로부터 읽고, CPU Cache에 복사해둡니다. 만약 컴퓨팅 환경이 두 개 이상의 CPU가 돌아간다면 아래의 이미지처럼 각자의 CPU에서 이러한 동작이 일어나게 될 것입니다. non-volatile 변수들은 언제 JVM이 메인 메모리에서 CPU Cach..
-
[Effective Java] Item 81. wait와 notify보다는 동시성 유틸리티를 애용하라Java/Effective Java 2020. 11. 19. 00:02
동시성 컬렉션 (concurrent collection) 동시성 컬렉션은 List, Queue, Map 같은 표준 컬렉션 인터페이스에 동시성을 고려하여 구현한 고성능 컬렉션입니다. 높은 동시성에 도달하기 위해 동기화를 각자의 내부에서 수행합니다. 따라서 동시성 컬렉션에서 동시성을 무력화하는 건 불가능하며, 외부에서 락을 추가로 사용하면 오히려 속도가 느려집니다. 동시성 컬렉션에서 동시성을 무력화하지 못하므로 여러 메서드를 원자적으로 묶어 호출하는 일은 불가능합니다. 그래서 여러 기본 동작을 하나의 원자적 동작으로 묶는 '상태 의존적 수정' 메서드들이 추가되었습니다. 예를 들어 Map의 putIfAbsent(key, value) 메서드는 주어진 키에 매핑된 값이 아직 없을 때만 새 값을 넣고 null을 반..
-
[Effective Java] Item 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라Java/Effective Java 2020. 11. 17. 00:07
java.util.concurrent 패키지 java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있습니다. 이를 이용하면 아래와 같이 간단하게 스레드 풀을 이용할 수 있습니다. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(() -> System.out.prin..