목록2025/03 (5)
csct3434

자바에서 네트워크 서버를 구현할 때 사용할 수 있는 두 가지 주요 API가 있다: 전통적인 블로킹 I/O 기반의 ServerSocket과 Java NIO(New I/O)의 ServerSocketChannel. 이 두 클래스는 서버 소켓을 구현하는 다른 패러다임을 제공하며, 각각 고유한 장단점과 사용 사례를 가지고 있다.1. ServerSocket (java.net 패키지)ServerSocket은 자바의 전통적인 네트워킹 API의 일부로, Java 1.0에서 도입되었다. 블로킹 I/O 모델을 기반으로 하며 동기적 접근 방식을 사용한다.주요 특징블로킹 I/O: 클라이언트 연결을 대기하는 accept() 메서드는 클라이언트가 연결할 때까지 현재 스레드를 블로킹한다.스트림 기반: 데이터 전송에 InputStre..
1. Fork Join Framework의 개요Fork Join Framework는 Java 7에서 도입된 병렬 처리 프레임워크로, '분할 정복(divide and conquer)' 알고리즘을 효과적으로 구현할 수 있게 해준다. 이 프레임워크의 핵심 아이디어는 큰 작업을 작은 단위로 재귀적으로 분할(fork)하고, 각각의 결과를 합쳐(join) 최종 결과를 얻는 방식이다.주요 구성 요소ForkJoinPool: 작업 스케줄링과 실행을 관리하는 특수한 ExecutorServiceForkJoinTask: 풀에서 실행되는 기본 태스크 타입 (RecursiveAction, RecursiveTask의 상위 클래스)Work-Stealing 알고리즘: 유휴 스레드가 다른 바쁜 스레드의 작업 큐에서 작업을 '훔쳐와' 처..

Redis를 사용하는 분산 환경에서 동시성 제어는 데이터 일관성을 유지하는 데 매우 중요합니다. 두 가지 주요 접근 방식인 낙관적 락과 분산 락의 차이점과 각각의 사용 사례를 자세히 살펴보겠습니다.1. 개념 및 기본 원리낙관적 락(Optimistic Lock)기본 원리: 충돌이 드물게 발생한다고 가정하고, 실제 업데이트 시점에만 충돌을 검사구현 방식: Redis의 WATCH, MULTI, EXEC 명령어 조합 사용작동 방식: 키를 감시(watch)하고 변경 감지 시 트랜잭션 실패 처리분산 락(Distributed Lock)기본 원리: 자원에 접근하기 전에 명시적으로 락을 획득하고 작업 후 해제구현 방식: Redis의 SET NX PX 또는 Redisson 라이브러리 사용작동 방식: 락을 성공적으로 획득한..
멀티스레드 환경에서 공유 자원에 대한 안전한 접근을 보장하는 방법은 크게 두 가지로 나눌 수 있다: 블로킹(blocking) 방식과 논블로킹(non-blocking) 방식이다. 이 글에서는 논블로킹 동시성 제어의 핵심 메커니즘인 CAS(Compare-And-Swap)에 대해 심층적으로 살펴보고자 한다.CAS란 무엇인가?CAS(Compare-And-Swap)는 멀티스레드 환경에서 원자적(atomic) 연산을 지원하는 저수준 하드웨어 명령어다. 이름에서 알 수 있듯이, CAS는 두 가지 주요 작업을 수행한다:Compare(비교): 메모리 위치의 현재 값을 예상 값과 비교한다.Swap(교환): 값이 일치하면, 새로운 값으로 교체한다.이 두 작업은 단일 원자적 연산으로 실행되기 때문에, 다른 스레드의 간섭 없이..
최근 자바 동시성 프로그래밍 스터디를 진행하면서 흥미로운 문제 상황을 경험했다. 세탁물 처리 파이프라인을 모델링한 멀티스레드 프로그램에서 무한 Busy Waiting이 발생했는데, 이는 JVM 메모리 모델과 CPU 캐시 가시성(visibility) 문제와 직접적인 관련이 있었다. 이 글에서는 해당 문제의 원인과 다양한 해결책을 살펴보고자 한다.문제 상황: 세탁물 처리 파이프라인먼저 문제가 발생한 코드를 간략히 살펴보자. 아래 코드는 세탁소 파이프라인을 모델링한 멀티스레드 프로그램이다:public class MissionA2 { // 세탁물을 표현하는 레코드 private record Washload(int number) {} // 세탁을 담당하는 스레드 private static c..