JVM 동시성 프로그래밍 딥다이브 6-1. Synchronization Fundamentals 동기화 기법 - Mutual Exclusion (상호배제)
·
기술 학습/JVM 스레드 딥다이브
개요Mutual Exclusion / 상호배제는 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 ["락/Lock"] 매커니즘이다.스레드가 임계영역에서 Mutex 객체의 플래그를 소유하고 있으면 (락 획득) 다른 스레드가 액세스할 수 없으며 해당 임계 영역에 액세스 하려고 시도하는 모든 스레드는 차단된다. Mutex 객체 플래그가 해제된 경우 (락 해제)에만 액세스할 수 있다.Mutex 락을 가진 오직 한개의 스레드만이 임계영역에 진입할 수 있고 락을 획득한 스레드만이 락을 해제할 수 있다.Mutext뮤텍스는 락/락 해제를 통해 자원을 보호하는 락체계 동기화 도구이다.문제점데드락데드락은 두 개 이상의 스레드가 서로가 가진 락을 기다리면서 상호적으로 블로킹 되는 경우.이로 인해 아무 작업도 수행할..
JVM 동시성 프로그래밍 딥다이브 5. Synchronization Fundamentals 동기화 개념 - 싱글/멀티 스레드 & 동기화
·
기술 학습/JVM 스레드 딥다이브
싱글 스레드 & 멀티 스레드개요프로세스는 오직 한개의 스레드로만 구성되는 싱글 스레드 프로세스와 하나 이상의 스레드로 구성되는 멀티 스레드 프로세스로 구분된다.스레드의 선택 기준은 어떤 방식이 더 효율적으로 자원을 사용하고 성능처리에 유리한가에 있다.싱글스레드 장점- 문맥교환 비용이 없다.- 동기화 이슈가 없다.- 자원 비용이 적다. 멀티스레드 장점- 동시성으로 사용자 응답성이 향상된다.- CPU 멀티코어의 병렬성으로 성능이 향상된다.- 한 스레드의 오류가 다른 스레드로 전파되지 않는다. 멀티스레딩과 동시성CPU의 동시적 작업 처리는 CPU 코어 개수보다 스레드의 개수가 많을 때, 즉 멀티스레딩 환경에서 자원을 효율적으로 배분하고 사용하기 위해 설계된 방식이다.같은 프로그램 안에서 실행되는 여러 스레드가..
JVM 동시성 프로그래밍 딥다이브 4-2. 스레드 활용 - ThreadLocal
·
기술 학습/JVM 스레드 딥다이브
개요ThreadLocal 객체 설명자바에서 스레드는 오직 자기 자신만이 접근해서 읽고, 쓸수 있는 로컬 변수 저장소를 제공하며, 이를 ThreadLocal이라고 한다.각 스레드는 고유한 ThreadLocal 객체를 속성으로 가지고 있으며 ThreadLocal은 스레드 간 격리되어있다.스레드는 ThreadLocal에 저장된 값을 특정한 위치나 시점에 상관없이 어디에서나 전역변수처럼 접근해서 사용할 수 있다.즉, 변수값을 전달해주지 않아도 된다.모든 스레드가 공통적으로 처리해야하는 기능이나 객체를 제어해야하는 상황에서 스레드마다 다른 값을 적용해야하는 경우 주로 사용한다. (Authorziation/Authentication 관리, 트랜잭션 관리, 로그 추적 등) ThreadLocalMap 객체 설명Thre..
JVM 동시성 프로그래밍 딥다이브 4-1. 스레드 활용 - 예외처리, 유저/데몬 스레드, ThreadGroup
·
기술 학습/JVM 스레드 딥다이브
스레드 예외 처리 UncaughtExceptionHandler기본적으로 스레드의 run()은 예외를 던질 수 없기 때문에 예외가 발생할 경우 run() 안에서만 예외를 처리해야 한다.Thread 밖에서 Thread 내부에서 발생한 RuntimeException을 Try Catch로 잡아봤자 예외는 잡아지지 않고, 사라져버린다.그렇다면 스레드가 비정상적으로 종료되었거나 특정한 예외를 스레드 외부에서 캐치하기 위해서 어떻게 해야할까?-> UncaughtExceptionHandler 인터페이스를 통해 예외를 핸들링하게 된다. UncaughtExceptionHandler캐치되지 않는 예외에 의해 Thread가 비정상 종료되었을 때 호출되는 핸들러 인터페이스이다.@FunctionalInterfacepublic i..
JVM 동시성 프로그래밍 딥다이브 3. 스레드 기본 API - Sleep, Join, Interrupt 등
·
기술 학습/JVM 스레드 딥다이브
JVM의 Thread 객체가 갖고 있는 기본적인 API들이 있다.우선 Sleep, Join, Interrupt에 대해 알아보자.다양한 메소드들을 제공하고 있고 그에 따른 동작과 상태 변화들이 있다.Sleep()sleep 메소드는 지정된 시간 동안 현재 스레드의 실행을 일시 정지하고 대기 상태(Blocked)로 빠졌다가 시간이 지나면 실행대기 상태(Runnable)로 전환된다.native 메소드로 연결되어 시스템 콜이 발생하며 커널모드에서 수행 후 유저모드로 전환된다. 즉, 오버헤드가 존재한다.API- sleep(m: 밀리초)- sleep(m: 밀리초, n: 나노초)- InterruptedException스레드가 수면중에 인터럽트되면 InterruptedException이 발생한다.다른 스레드는 잠자고 있..
JVM 동시성 프로그래밍 딥다이브 2. 스레드 생명주기와 상태
·
기술 학습/JVM 스레드 딥다이브
앞에서 봤든 JVM은 일대일 매핑 스레드 구조이고 사용자 영역 스레드에서 커널을 생성하면 커널 영역 스레드와 매핑되어서 작업이 처리되는것이다.즉,자바 스레드는 JVM에서 User Thread를 생성할 때 시스템 콜을 통해서 커널에서 생성된 Kernel Thread 와 1:1 로 매핑이 되어 최종적으로 커널에서 관리된다.JVM에서 스레드를 생성할 때 마다 커널에서 자바 스레드와 대응하는 커널 스레드를 생성한다.자바에서는 Platform Thread으로 정의되어 있다. 즉 OS 플랫폼에 따라 JVM이 사용자 스레드를 매핑하게 된다.플랫폼 스레드- 스레드에서는 일반적으로 운영체제에서 예약된 커널 스레드와 1:1로 매핑되는 플랫폼 스레드 생성을 지원한다.ThreadJVM 에서 스레드에 대해 좀 더 알아보자. 사..
Spring @Transactional - JdbcTemplate에 트랜잭션이 전파되는 원리 정리글
·
Web/정리글
Spring 환경에서는 JPA의 더티 체킹이나 Bulk Insert 등에서 성능 이슈로 인해 JdbcTemplate을 혼용해서 사용해야 할 때가 있다. (MySQL의 PK 전략이 IDENTITY AUTO INCREMENT 인 경우 가정)이때 우리는 자연스럽게 Service 계층에 @Transactional을 붙이고, 내부에서 jdbcTemplate.update() 등을 호출한다. 근데 여기서 이런 의문이 든다."나는 JdbcTemplate 메서드에 DB Connection을 넘겨준 적이 없는데, 어떻게 기존 트랜잭션에 참여해서 동작하는 걸까?" Spring이 어떻게 트랜잭션 컨텍스트를 유지하고 전파하는지, 그 핵심 원리인 트랜잭션 동기화(Transaction Synchronization) 에 대해 정리해..
JVM 동시성 프로그래밍 딥다이브 1. 프로세스 & 스레드
·
기술 학습/JVM 스레드 딥다이브
기본기는 가볍게 정리해본다.프로세스프로세스는 운영체제에 의해 실행되는 포로그램이다.code, data, heap, stack 메모리 공간을 갖는다.stack은 지역변수, heap은 메모리 등을 사용하게 되는 동적 할당의 영역이다.code, data는 정적 할당의 영역이다.스레드스레드는 프로세스의 작업을 수행하는 최소 실행 단위이다.스레드는 프로세스의 code, data, heap은 공유자원으로 사용한다.스레드는 개별 stack을 갖는다.CPU스레드는 운영체제 스케쥴러에 의해 관리되는 CPU의 최소 실행 단위이다.스레드가 CPU를 선점하게된다.CPU를 스레드가 선점할 때 문맥(레지스터, 캐시 등이 교체되는) 교환이 발생한다. (=컨텍스트 스위칭)동시성 / 병렬성 개념을 정리해보자.동시성동시성은 CPU가 한..
모던 자바 인 액션 Chapter. 5 - 스트림 활용 (5.5 ~ 5.9)
·
기술 학습/모던 자바 인 액션
Chapter. 5 - 스트림 활용 (5.5 ~ 5.9)5.5 리듀스“메뉴의 모든 칼로리의 합계를 구하시오", “메뉴에서 칼로리가 가장 큰 요리는?” 과 같이 스트림 요소를 조합해서 더 복잡한 질의를 표현하기 위한 메서드이다.즉, 리듀스는 스트림의 모든 요소를 반복 처리해서 값으로 결과를 도출해낼 때 사용한다.5.5.1 요소의 합for-each 반복문을 통한 리스트 내 숫자 요소의 총 합을 구하는 코드를 보자.val numbers = listOf(1, 2, 3, 4, 5)var sum = 0for (x: Int in numbers) { sum += x}위 코드를 보면 sum 변수 초기값 0리스트의 모든 요소를 조합하는 연산 “+”이렇게 2개의 파라미터를 사용했다. 이러한 리스트 연산의 총 합을 구하..
모던 자바 인 액션 Chapter. 5 - 스트림 활용 (5.1 ~ 5.4)
·
기술 학습/모던 자바 인 액션
Chapter. 5 - 스트림 활용 (5.1 ~ 5.4)stream을 활용해서 외부반복을 내부반복으로 변경할 수 있다는걸 확인했다.// 내부반복val vegetarianDishes = mutableListOf()for (dish in menu) { if (dish.isVegetarian()) { vegetarianDishes.add(dish) }}// 내부반복val vegetarianDishes = menu.stream() .filter(Dish::isVegetarian) .collect(toList())위처럼 데이터를 어떻게 처리할지는 스트림 API가 관리하므로 편리하게 데이터 처리가 가능하다.스트림 API를 사용하면 내부 반복 뿐만아니라 병렬 실행 여부도 결정할 수 ..