
배경. 배치를 만들던 도중에 Bean으로 등록해놓은 Thread Pool에 Thread가 꽉차서 Queue에 더 이상 Job이 들어갈 수 없다는 예외가 발생했습니다. 예를 들기 위해 테스트 코드를 하나 작성해보겠습니다. class ThreadPoolExecutorTest { @Test fun testThreadPoolQueueCapacity() { val executor = ThreadPoolExecutor( 2, // core pool size 2, // max pool size 0L, // keep alive time TimeUnit.MILLISECONDS, // time unit for keep alive time LinkedBlockingQueue(1) // queue with capacity 1..

스프링 MVC 구조는 tomcat 엔진에 thread pool을 사용하고 webflux 구조는 netty 엔진의 이벤트 루프를 통해 스레드를 미리 만들어놓은 환경에서 작업을 처리합니다. 이렇게 미리 만들어놓고 쓰는 이유는 스레드를 생성될 때마다 비용이 비싸기 때문에 미리 만들어 놔야 한다고 알고 있을겁니다. 이번 포스팅에서는 그 이유에 대해 알아보도록 하겠습니다. One-To-One multi-threading model 먼저 JVM에서의 다중 Thread 모델은 one to one 모델을 따르고 있습니다. 그렇다면 이 모델은 도데체 무엇이고 thread pool 등장 배경과 무슨 관계 일까요? one to one 모델은 사용자 수준의 thread와 커널 스레드가 1대 1로 연결되어있는 형태를 말합니다...
Thread Local은 자바에서 제공해주는 멀티 스레드 환경에서 각각의 스레드에게 별도의 자원을 제공함으로써 공유되는 서비스에서 별도의 자원에 접근하게끔 하여 각각의 스레드가 각각의 상태를 가질 수 있도록 도와주고 있습니다. 실제로 Thread Local은 Spring진영에서 유용하게 쓰이고 있습니다. 대표적으로 RequestAttribute하고 SecurityContext가 존재합니다. 그렇다면 스프링에서 유용하게 쓰이는지 알아봅시다. 예를들어 로그인 기능이 존재하고 생각해봅시다. A와 B가 각각 클라이언트 요청을 통해 로그인이 필요한 상품 구매 시스템을 이용한다고 생각해 봅시다. Thread 1 - 로그인 정보를 갖고 상품 구매 요청 싱글톤 서비스 - 요청으로 들어온 로그인 정보 검증 및 저장 Th..

Thread 가시성이란 ? Thread 가시성이란 Thread의 시야 범위를 뜻한다. 공유하는 변수에 연산이 일어날 때 CPU를 점유하고 동작하는데 이 때 main memory에만 존재하는 것이 아니라 CPU cache에도 공유하는 자원에 대한 데이터가 들어있다. 이 때 CPU cache를 읽어오는데 언제 main memory에 옮겨갈 지 모르기 때문에 여러 thread가 동시에 읽음 연산과 쓰기 연산을 한다면 main memory에서 cache로 데이터를 옮기는 과정에서 다른 thread가 연산을 진행하여 결국 데이터 불일치 문제가 생기는 것이다. 이런 불일치 문제를 Thread 가시성 이슈라고 하며 자바에서는 volatile 키워드를 통해 해결할 수 있다. volatile은 캐시가 아닌 main me..

최근 회사에서 작업을 하면서 문제가 생긴 이력이 있다. 발생한 이슈는 50000개 이상의 데이터를 고객에게 전달해줘야하는 배치 프로그램에서 약 400 ~ 500개의 데이터가 손실된 것이었다. 재빨리 문제를 파악하기 시작하였고 원인은 다음과 같았다. 현재 ArrayList는 heap 영역에 올라가 있어 Thread간에 자원을 공유하고 있는 상황이다. 자원을 공유하기 때문에 함수를 실행하는 과정에서 race condition이 발생하였고 데이터가 덮어씌워졌다. 이 문제를 해결하기위해 우리는 발생의 근원이 되는 Concurrency(동시성)과 Parallel(병렬성)에 대해 알아보고 문제를 해결하기 위한 전략까지 살펴볼 것이다. Concurrency 동시성은 한마디로 설명하면 동시에 실행되는 것 처럼 보여지는..
컴퓨터는 하나의 프로그램을 실행하여 사용자들로 하여금 서비스를 이용할 수 있게 하는데 이를 Process 라고 한다. 이 프로세스는 안에 작업을 하는 주체가 따로 존재하는데 우리는 이를 Thread라고 부른다. Thread를 알기 위해서는 프로세스에 대해 알아야할 필요가 있다. 프로세스를 시작으로 멀티스레드 동시성 까지 천천히 알아가보도록 하자 Process Process는 CPU 자원을 할당 받아 프로그램을 실행시킨다. Process안에는 프로그램을 실행시키기 위한 여러 주체가 존재하는데 안을 간단하게 살펴보자. 1. PCB 프로세스 제어 블록이라 불리는 PCB는 프로세스 고유 식별자(PID)와 레지스터 프로세스 상태등을 저장하고 있다. 프로세스가 생성과 동시에 고유한 PCB가 생성되고 OS는 PCB를..
- Total
- Today
- Yesterday
- CS
- 자바
- docker
- thread
- Redis
- 백엔드
- 게시판
- MySQL
- 코딩
- 면접
- 동시성
- 취준
- 개발
- java
- IT
- 프로그래밍
- 취업준비
- 인터뷰
- DevOps
- JPA
- Spring
- DB
- lock
- 코드
- 면접준비
- Kotlin
- 프로젝트
- 취업
- 면접 준비
- 개발자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |