ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상
📘 Backend/Concurrency2024. 5. 3. 15:34ReentrantReadWriteLock - ReadLock & WriteLock을 사용한 Read Thread 성능 향상

ReentrantReadWriteLock왜 사용해야 하는지?주로 읽기 작업이 많은 어플리케이션에서 읽기 작업이 느릴때읽기 작업에 드는 비용이 클 때읽기 작업을 수행하는 Reader Thread가 여러개일때 이런 상황이 왜 문제일까?읽기 작업을 수행하는 Thread가 여러개가 있고,한 Thread가 공유 Resource를 읽을때 다른 Thread들은 Blocking 상태가 됩니다. 이때 앱의 읽기 성능애 문제가 생깁니다. (다른 Thread들은 대기상태 이기 때문)위와 같은 상황을 ReentrantReadWriteLock을 사용하여, 읽기 작업을 수행하는 Thread들의 공유 리소스 동시 접근이 가능하게 하기 위한 클래스가 ReentrantReadWriteLock 입니다.사용법Thread 여러개가 있는 앱..

ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때
📘 Backend/Concurrency2024. 4. 30. 17:53ReentrantLock - Lock 획득을 위해 대기중인 Thread에 Interrupt 호출이 안먹힐 때

ReentrantLock - lockInterruptibly()특정 Thread에서 Lock 획득을 위해lock.lock()을 호출했을 때 다른 스레드에 의해 이미 Lock이 점유되어 있는 상황에서 현재 Thread는 Lock이 해제되는걸 기다리기 위해 무한 대기 상태에 걸려 있습니다. (Blocking 상태)이때 대기 상태를 해제하기 위해 Thread를 Interrupt를 시켰는데 Interrupt 호출이 되지 않아서, 알아보고 해결한 방법을 기록합니다.아래 예시 코드로 설명해보겠습니다.lockInterruptibly()를 사용해야 하는 이유 - 예시 코드@Overridepublic void run() { lock.lock(); // Lock 획득 실패 - 다른 스레드에서 사용 중 // ....

Atomic Operation & volatile & Metrics
📘 Backend/Concurrency2024. 1. 6. 23:03Atomic Operation & volatile & Metrics

📘 Atomic Operation의 판단 기준 원자적인 연산(Atomic Operation)을 판단하는 기준이 뭘까요? 전 글에서 예시를 들며 학습 했었지만 아직 크게 와 닿지는 않습니다. 그래서 어떤 연산지 원자적인지 모르니까 모든 함수를 synchronized를 이용해 동기화 한다고 가정해봅니다. 즉, 공유 변수에 액세스할 수 있는 모든 함수를 동기화 시킵니다. 그럼 병렬로 실행되는 코드의 개수를 최소화 해주게 되는데요. 예를 들어 동시 실행 될 거라 짐작하는 스레드를 4개 만들어서 실행하면, 모든 함수가 동기화 된 상태라 한번에 1개의 스레드만 실행 되고 나머지 3개는 Suspend 상태로 있게 됩니다. 이러면 사실상 스레드 1개만 있는것과 다를게 없습니다. 더 안 좋은 점은 여러 스레드를 유지하기..

Critical Section & Synchronized with Lock
📘 Backend/Concurrency2024. 1. 6. 20:37Critical Section & Synchronized with Lock

📘 Critical Section & Synchronized with Lock Thread 간 Resource 공유 시 발생할 수 있는 문제 - 지난 포스팅 글 전에 포스팅한 글에서 다뤘던 코드의 문제점을 다시 한 번 살펴봅니다. 2개의 스레드가 1개의 Counter를 공유하는데, 둘 다 그 카운터를 read/write 할 수 있었습니다. 또, 해당 작업들은 비 원자적(Atomic Operation) 입니다. 위 문제는 흔히 발생하는 문제로 일반적으로는 여러 작업의 집합을 모두 1개의 원자적 작업으로 보이게 만들곤 합니다. 어떠한 경우에도 2개의 스레드가 작업을 동시에 수행할 순 없기 때문입니다. void aggregateFunction() { operation1(); operation1(); opera..

Thread 간 Resource 공유 시 발생할 수 있는 문제
📘 Backend/Concurrency2024. 1. 6. 19:25Thread 간 Resource 공유 시 발생할 수 있는 문제

📘 스레드 간 리소스 공유 이번에는 Heap에 있는 변수를 공유해 서로 다른 스레드로 비 원자적인 작업을 동시에 수행하는 작업을 구현해 보았습니다. 이런 작업을 수행할때 생길 수 있는 문제점을 아래 예시 코드와 같이 작성하였습니다. 🚩 프로세스 내에서 공유할 수 있는 리소스 힙에 할당된 모든 항목 객체, 클래스 멤버, static 변수 프로세스 외부에 있는 모든 항목 📘 Thread 실행 순서 제어를 통한 예시 Thread.join()을 이용해 바로 예시 코드를 보겠습니다. @Slf4j public class InventoryCounter { public static void main(String[] args) throws InterruptedException { Counter counter = new ..

ReentrantLock을 이용한 Thread 동기화
📘 Backend/Concurrency2023. 12. 26. 19:09ReentrantLock을 이용한 Thread 동기화

📘 ReentrantLock 이번에 일을 하던 중 ReentrantLock을 사용해 Concurrency한 환경에서 여러 Thread간 안전하게 Lock을 사용 & 제공하며, Interrupt 처리를 통해 Thread간 상호작용을 제어하고 Thread Safe한 기능의 개발을 위해 사용했었습니다. 완벽하게 숙지를 못한 상태에서 일단 사용한 것이므로 예시를 통해 ReentrantLock을 복습한 글입니다. 📕 Synchronization ReentrantLock의 lock() & unLock() & tryLock() 을 이용해 Thread간 Race Condition을 방지하고, lockInterruptibly() 를 사용해 Lock을 획득할 때 다른 Thread에 의해 해당 Thread가 Interrup..

Throughput Optimization - 처리량 최적화 & 성능 테스트 (Apache Jmeter)
📘 Backend/Concurrency2023. 12. 3. 18:17Throughput Optimization - 처리량 최적화 & 성능 테스트 (Apache Jmeter)

📘 처리량 최적화 - 개념 이번에는 성능 정의 중 2번째인 처리량에 대해 알아보겠습니다. 처리량이란 주어진 기간에 완성되는 작업의 수를 뜻합니다, 보통 처리량은 시간 단위 / 초 단위로 작업을 나눠 측정합니다. 처리량 향상을 위한 2가지 접근법 Thread Pooling 📘 어플리케이션의 처리량 개선 방법 하나의 작업을 완수하는데 T의 시간이 걸리면 이룰수 있는 최소 처리량은 1/T 가 됩니다. 작업은 하위 Task로 나눌 수 있다면 T/N의 최대 처리량을 얻을 수 있습니다. 하지만, 하위 Task로 작업을 나누더라도 T/N 보다 낮은 처리량을 얻을 확률도 높습니다. 지연 시간을 최적화 할 때와 같은 단점을 가지고 있기 떄문입니다. 📕 1. 작업을 하위작업으로 나누기 (지연 시간을 최적화 할 때와 같은 ..

image