Language/Java (22) 썸네일형 리스트형 [JAVA] Java Concurrent 패키지 - Atomic 자료형 완전 정리 목차Atomic 자료형이란?왜 필요한가? — 동시성 문제 예시CAS(Compare-And-Swap) 원리Atomic 자료형 종류주요 API 사용법AtomicReference와 ABA 문제synchronized vs Atomic — 언제 무엇을 쓸까?마무리 1. Atomic 자료형이란?java.util.concurrent.atomic 패키지에 속하는 클래스들로, 락(Lock) 없이 스레드 안전한 원자적 연산을 제공합니다.원자적(Atomic)이란? 연산이 "완전히 실행되거나, 전혀 실행되지 않거나" 둘 중 하나임을 보장하는 것.중간 상태가 다른 스레드에게 노출되지 않습니다. 멀티스레드 환경에서 공유 변수를 다룰 때 synchronized나 Lock 없이도 안전하게 읽기/쓰기/업데이트가 가능합니다. volat.. [Java] Java 비동기 결과 처리의 진화: Callable → Future → CompletableFuture 이전 포스트에서 Java 동시성 구현 메커니즘(Thread / ExecutorService / ForkJoinPool / VirtualThread)을 살펴보았습니다.이번 포스트에서는 비동기 작업의 결과를 어떻게 받고 조합하는가에 초점을 맞춥니다. 들어가며: 비동기란 무엇인가?비동기(Asynchronous)란 작업을 요청하고, 그 결과를 기다리지 않고 다음 코드를 실행하는 방식입니다.DB 조회, 네트워크 요청처럼 오래 걸리는 작업을 기다리는 동안 메인 스레드가 멈춰 있으면 낭비입니다. 그 시간에 다른 일을 하는 것이 비동기의 핵심입니다. 동기는 메인 스레드가 작업이 끝날 때까지 멈춰서 기다립니다. 비동기는 별도 스레드에서 작업을 돌리고, 메인 스레드는 계속 다른 일을 합니다. 완료되면 콜백으로 결과를 받.. [Java] Java 8 — 메서드를 일급 시민으로 Java 8은 2014년에 출시되었지만, 10년이 넘은 지금까지도 Java 생태계에서 가장 중요한 전환점으로 꼽힙니다. 람다, 스트림, Optional 등 수많은 기능이 추가되었는데, 이 모든 변화의 근본적인 출발점은 하나입니다.메서드를 일급 시민(first-class citizen)으로 만든 것.이번 글에서는 이 개념이 무엇인지, 그리고 이것이 동작 파라미터화, 함수형 인터페이스, 람다와 어떻게 하나의 맥락으로 연결되는지 정리해 보겠습니다. 1. 동작 파라미터화 — 출발점이 된 설계 아이디어개별 개념을 설명하기 전에, 먼저 왜 메서드를 일급 시민으로 만들어야 했는지 동기부터 살펴보겠습니다. 1.1 문제 상황 — 변하는 요구사항사과 목록에서 조건에 맞는 사과를 필터링한다고 해봅시다.// 초록 사과만 필터.. [JAVA] 자바의 동시성 구현 방법 들어가며이전 포스트에서 스레드 안전성의 다섯 가지 수준과 락 최적화 기법을 살펴보았습니다. 이번 포스트에서는 한 걸음 뒤로 물러나, 자바에서 동시성(Concurrency)을 구현하는 네 가지 메커니즘을 정리합니다. 자바의 동시성 모델은 버전이 올라가면서 점점 추상화 수준이 높아져 왔습니다. 스레드를 직접 생성하던 시대에서 시작해, 스레드 풀에 작업을 제출하고, 작업을 분할·병합하며, 최근에는 JVM이 경량 스레드를 직접 스케줄링하는 단계까지 발전했습니다. 1. Thread / Runnable — 직접 스레드 관리자바에서 동시성을 구현하는 가장 기본적인 방법입니다. Java 1.0부터 존재했으며, 두 가지 방식으로 사용할 수 있습니다.1-1. Thread 상속public class MyThread ex.. [Java] 자바의 스레드 안전성 구현과 락 최적화 들어가며앞선 포스트들에서 JVM의 메모리 구조와 가비지 컬렉터를 깊이 있게 살펴보았습니다. 이번 포스트에서는 자바에서 스레드 안전성(Thread Safety)을 어떻게 구현하는지, 그리고 HotSpot JVM이 synchronized의 성능을 끌어올리기 위해 적용하는 락 최적화 기법들을 정리합니다. 1. 스레드 안전성의 다섯 가지 수준자바에서 스레드 안전성은 강한 순서대로 다섯 가지 수준으로 분류할 수 있습니다.1-1. 불변 (Immutable)가장 강력한 스레드 안전성입니다. 객체가 생성된 이후 상태가 절대 변하지 않으므로, 어떤 동기화도 필요 없습니다. String, Long, BigInteger 등이 대표적이며, final 키워드로 선언된 필드들로 구성됩니다. 1-2. 절대적 스레드 안전 (Abso.. [Java] volatile 키워드 완전 정리 - JMM부터 하드웨어 동작까지 1. Java Memory Model(JMM)과 메모리 구조Java에서 멀티스레드 프로그래밍을 이해하려면 먼저 JMM이 정의하는 메모리 구조를 알아야 한다.JMM은 메인 메모리(Main Memory) 와 작업 메모리(Working Memory) 라는 두 가지 논리적 영역을 정의한다.메인 메모리: 모든 스레드가 공유하는 영역. 인스턴스 변수, 클래스 변수 등 공유 데이터가 저장된다.작업 메모리: 각 스레드가 독립적으로 가지는 영역. 메인 메모리의 값을 복사해서 사용한다.각 스레드는 메인 메모리에 직접 접근하지 않고, 자신의 작업 메모리에 복사된 값을 읽고 쓴다. 그리고 필요한 시점에 메인 메모리와 동기화한다. 여기서 핵심은, 작업 메모리는 논리적 개념이라는 것이다. 실제 하드웨어에서는 CPU 레지스터와 캐.. [Java] Java 스레드의 모든 것 — 스레드 모델부터 Virtual Thread까지 1. 스레드 구현 모델스레드는 사용자 스레드(User Thread)와 커널 스레드(Kernel Thread) 간의 매핑 방식에 따라 세 가지 모델로 나뉜다. 1-1. M:1 모델 (사용자 레벨 스레드)사용자 스레드 M개가 커널 스레드 1개에 매핑되는 모델이다. 스레드 생성과 전환이 유저 공간에서 일어나므로 매우 빠르고 가볍다.하지만 치명적인 한계가 있다. 커널 스레드가 하나뿐이므로 하나의 스레드가 블로킹 시스템 콜을 하면 전체 스레드가 멈춘다. 커널은 스레드가 하나라고 인식하기 때문에 멀티코어 활용도 불가능하다. 초기 Java의 Green Thread가 이 모델이었다. 이러한 한계 때문에 Java는 1:1 모델로 전환하게 된다.1-2. 1:1 모델 (커널 레벨 스레드)사용자 스레드 하나가 커널 스레드 하.. [Java][BufferedReader] 동기화 메커니즘 - 데코레이터 패턴의 적용 BufferedReader 동기화 메커니즘 - synchronized(lock)의 비밀BufferedReader 소스 코드를 보다 보면 synchronized (lock)이라는 구문을 자주 만납니다. 왜 synchronized 메서드를 쓰지 않고 굳이 lock 필드를 사용할까요?이번 글에서는 Java I/O의 동기화 설계에 대해 깊이 파헤쳐보겠습니다.1. BufferedReader의 동기화 코드read() 메서드를 보면:public int read() throws IOException { synchronized (lock) { // ← lock 객체로 동기화 ensureOpen(); if (nextChar >= nChars) fill(); .. 이전 1 2 3 다음