Java/Concurrency 12

Java > Concurrency > 10. Thread pool, Executor framework

스레드 직접 사용할 때의 문제점1. 스레드 생성 비용으로 인한 성능 문제메모리 할당각 스레드는 자신만의 호출 스택을 가진다보통 1MB 이상의 메모리를 사용한다OS 자원 사용스레드 생성은 OS 커널 수준에서 이루어지며, 시스템 호출을 통해 처리된다OS 스케줄러 설정OS 스케줄러가 스레드를 관리하고 실행 순서를 조정한다 스레드를 생성하는 작업은 상대적으로 무겁다. 아주 가벼운 작업이라면 작업의 실행 시간보다 생성 시간이 더 오래 걸릴 수도 있다 이러한 문제는 스레드 재사용을 통해 해결할 수 있다2. 스레드 관리 문제서버의 CPU, 메모리 자원은 한정되어 있기에 스레드는 무한히 만들 수 없다 사용자의 요청을 처리하는 스레드가 평소에는 100개면 충분했는데, 10,000명의 사용자가 몰려 10,000개의 스레드..

Java/Concurrency 2024.10.14

Java > Concurrency > 9. Concurrent Collections

java.util 패키지의 컬렉션 프레임워크대부분 Thread safe하지 않음 단일 스레드가 컬렉션 사용 시 성능이 좋다  Collections.synchronized~ 동기화 메서드스레드 안전하지 않은 많은 컬렉션들을 편리하게 스레드 안전한 컬렉션으로 변경해준다 단점동기화 오버헤드잠금 범위가 넓어져 잠금 경합(Lock contention) 증가, 병렬 처리 효율 저하모든 메서드에 동기화 적용정교한 동기화 불가과도한 동기화  java.util.concurrent 패키지의 컬렉션 프레임워크위 방식의 단점 보완자바 1.5부터 제공 스레드 안전하며 고성능 멀티 스레드 환경을 지원하는 다양한 동시성 컬렉션 클래스 제공 다양한 성능 최적화 기법이 적용되어 있다synchronizedLock (ReentrantLo..

Java/Concurrency 2024.10.14

Java > Concurrency > Atomic operation, CAS

원자적 연산해당 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것 원자적 연산은 중단되지 않고, 실행되거나 실행되지 않는 성질을 가진다 멀티 쓰레드 환경에서는 다른 쓰레드의 간섭 없이 안전하게 처리됨을 의미한다 원자적 연산int i = 0;원자적 연산 Xi += 1;i++; 원자적 연산이 아니라면 synchronized나 Lock 등을 이용해 안전한 임계 영역을 만들어야 한다AtomicInteger 등 Atomic~멀티 쓰레드 환경에서 안전하게 증감 연산을 수행할 수 있게 해주는 객체 snychronized, ReentrantLock 보다 빠르다 그 이유는 incrementAndGet() 메서드는 락을 사용하지 않고 원자적 연산을 수행하기 때문  https://github.com/venzersiz/le..

Java/Concurrency 2024.10.04

Java > Concurrency > 7. Synchronization

동시성 문제같은 자원에 여러 쓰레드가 동시에 접근할 때 발생하는 문제 여러 쓰레드가 접근하는 자원을 공유(Shared) 자원이라고 한다. 대표적 공유 자원은 인스턴스 필드이다 쓰레드의 공유 자원에 대한 접근을 동기화하여 동시성 문제를 해결할 수 있다  Critical section임계 영역 여러 쓰레드가 동시에 접근하면 데이터 불일치나 예상치 못한 동작이 발생할 수 있는 위험하고 중요한 코드 부분여러 쓰레드가 공유 자원을 접근하거나 수정하는 부분  동기화(Syncrhonization)여러 쓰레드가 공유 자원에 대해 일관성 있고 안전한 접근을 보장하기 위한 메커니즘 아래 문제를 해결할 수 있다경합 조건(Race condition)여러 쓰레드가 동시에 읽고 쓰는 데이터의 일관성 멀티 쓰레드 환경에서 필수적이..

Java/Concurrency 2024.09.23

Java > Concurrency > 6. Memory visibility

메모리 가시성멀티 쓰레드 환경에서 한 쓰레드가 변경한 값이 다른 쓰레드에게 언제, 어떻게 보여지는지에 대한 문제를 말한다여러 쓰레드가 공유된 하나의 메모리에 접근할 때 이 문제가 발생한다 volatile 키워드를 사용해 문제를 해결할 수 있다https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadVolatileTest.java 쓰레드 동기화 기법을 사용할 수도 있다https://github.com/venzersiz/learn-java8/tree/master/src/test/java/concurrency/synchorize  Java Memory Model여러 쓰레드들이 메모리를 공유하고 상호작용하..

Java/Concurrency 2024.09.13

Java > Concurrency > 3. Thread info

쓰레드는 다음과 같은 속성을 가진다idnamestateprioritythreadGroup https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadInfoTest.java  Thread priority쓰레드는 우선순위를 가지며, 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다 작업의 중요도에 따라 쓰레드 우선순위를 다르게 설정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다 예를 들어 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 전송 쓰레드의 우선순위가 높아야 채팅이 원활할 것이다(대신 다운로드는 더 오래 걸릴 것이다). 이처럼 UI 관련 쓰레드는 다른 쓰레드보다 우선 순위..

Java/Concurrency 2024.09.05

Java > Concurrency > Thread scheduling

스케줄링CPU에 어떤 프로그램이 얼마의 시간동안 실행될지를 OS가 결정하는 것 단순히 시간으로만 작업을 분할하지는 않고 다양한 우선순위와 최적화 기법을 사용한다 동작 예OS는 내부에 스케줄링 큐를 가지고 있고 쓰레드들은 큐에서 대기한다OS는 큐에서 쓰레드 A를 꺼내 CPU를 통해 실행한다OS는 쓰레드 A를 잠시 멈추고 큐에 다시 넣는다OS는 쓰레드 B를 꺼내 CPU를 통해 실행한다이러한 과정을 반복한다 CPU core가 2개 이상이면 위 작업을 물리적으로 동시에 실행할 수 있다

Java/Concurrency 2024.09.03

Java > Concurrency > 4. Thread methods

쓰레드 프로그래밍이 어려운 이유는 동기화와 스케줄링 때문이다 효율적인 멀티 쓰레드 프로그램을 만들기 위해서는 보다 정교한 스케줄링을 통해 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비 없이 잘 사용하도록 프로그래밍 해야 한다 스케줄링을 위해 쓰레드의 상태와 상태 변경 메서드를 학습할 필요가 있다. 쓰레드의 상태는 아래 글에 설명해두었다2024.09.05 - [Java/Concurrency] - Java > Concurrency > 3. Thread info  Thread 클래스의 메서드void stop(), void suspend(), void resume()교착상태를 일으키기 쉽게 작성되어 있어, 사용자제(@Deprecated) 메서드로 정해졌다 해당 API를 사용하지 말고 아래와 같이 유사 기..

Java/Concurrency 2024.08.30

Java > Concurrency > 5. Daemon thread

명명 이유Daemon다이몬(고대 그리스 신화 속에 나오는 반신 반인의 존재) 신화에서 데몬은 신과 인간 사이의 중간적 존재로서 보이지 않게 활동하며 일상적인 일을 도왔다. 이를 차용하여 CS에서는 사용자에게 직접적으로 보여지지 않으면서 백그라운드로 작업을 수행하는 것을 데몬 프로세스/쓰레드라고 말한다 현대 그리스어 발음이 데몬이라 한국에서 데몬으로 읽는 것 같다  특징데몬 쓰레드는 다른 Non-daemon(일반, 사용자) 쓰레드의 작업을 돕는 보조적인 역할을 수행한다 모든 사용자 쓰레드가 종료되면 JVM도 종료된다. 이때 데몬 쓰레드도 자동 종료된다 데몬 쓰레드의 예GC워드 프로세서의 자동저장화면 자동 갱신..  코드 작성무한 반복문과 조건문을 이용해 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을..

Java/Concurrency 2024.08.29

Java > Concurrency > Context switching

Context의 사전적 뜻은 문맥이다. 여기서 문맥이라 함은 현재 작업하는 문맥을 말한다. 하나의 작업을 위해 메모리에 있는 값을 CPU가 읽고 작업 전환을 위해 CPU의 값을 다시 메모리에 저장하고, 이런 문맥을 전환하는 것을 컨텍스트 스위칭이라 한다 쓰레드 간의 작업 전환으로 인해, 단일 쓰레드로 작업한 시간보다 여러 쓰레드로 작업한 시간이 더 오래 걸리기도 한다 작업 전환 시 현재 작업의 상태(다음에 실행해야할 위치, Program Counter 등)를 저장하고 읽어 오는 시간이 소요된다 싱글 코어에서 CPU만을 사용하는 단순한 계산 작업을 할 때 오히려 싱글 쓰레드로 프로그래밍하는 것이 더 효율적이다https://github.com/venzersiz/learn-java8/blob/master/sr..

Java/Concurrency 2024.08.29