Java22 [Java] 동시성 문제 해결을 위한 atomic과 CAS 알고리즘 synchronized의 문제점synchronized는 blocking을사용하여 멀티 스레드 환경에서 공유 객체를 동기화하는 키워드입니다.그러나 blocking에는 여러 가지 단점이 존재하는데, 그 중에서 손 꼽는 문제는 성능 이슈입니다.특정 스레드가 해당 블럭 전체에 lock을 걸면, 해당 lock에 접근하는 스레드들은 블로킹 상태에 들어가기 때문에 아무 작업도 하지 못한 채 자원을 낭비합니다.또한 blocking 상태의 스레드를 준비 혹은 실행 상태로 변경하기 위해 시스템의 자원을 사용해야 합니다.결국 이 문제는 성능 저하로 이어집니다. 예를 들어 자동차 운전을 한다고 가정해보겠습니다.운전자가 방향 전환을 하려고 하는데, 마침 앞에 다른 자동차가 대기하고 있습니다.운전자는 앞의 차가 먼저 지나가기를 .. 2025. 2. 11. [Java] 동시성 문제 해결을 위한 synchronized 키워드 SynchronizedJava는 크게 3가지 메모리 영역을 가지고 있습니다.static 영역heap 영역stack 영역 자바 멀티 스레드 환경에서는 스레드끼리 static 영역과 heap 영역을 공유하므로 공유 자원에 대한 동기화 문제를 신경 써야 합니다 이전 글에서 소개했듯이, 원자성 문제를 해결하기 위한 방법 중 하나인 synchronized 키워드에 대해 설명하려고 합니다.synchronized는 lock을 이용해 동기화를 수행하며 4가지의 사용 방법이 존재합니다.synchronized methodstatic synchronized methodsynchronized blockstatic synchronized blocksynchronized methodpublic class Method { .. 2025. 2. 11. [Java] 가시성 문제 해결을 위한 volatile 키워드 이전 글에서는 동시성 프로그래밍에서 발생할 수 있는 문제 중 하나인 가시성 문제를 해결하기 위해 volatile 키워드를 사용한다고 하였습니다. 가시성 문제는 여러 개의 스레드가 사용됨에 따라, CPU Cache Memory와 RAM의 데이터가 서로 일치하지 않아 생기는 문제를 의미합니다. volatile 키워드를 붙인 공유 자원은 RAM에 직접 읽고 쓰는 작업을 수행할 수 있도록 해줍니다. 이번 글에서는 volatile 키워드를 통해 가시성을 보장하는 방법을 간단한 예시와 함께 설명하려고 합니다. 가시성을 보장하지 못한 예제public class Volatile { private static volatile boolean stopRequested; public static void main(.. 2025. 2. 11. [Java] 멀티스레드 환경에서의 동시성 이슈 개요 멀티 스레드를 사용하는 환경에서 각 스레드가 공유 자원에 동시에 접근하는 상황이라면 경쟁상태(Race condition)가 발생할 수 있습니다. 경쟁상태가 발생하게 되는 원인은 가시성(Visibility)과 원자성(Mutual Exclusion)을 보장하지 못했기 때문인데요, Java에서는 synchronized 키워드와 Atomic Type, Concurrent Collection 등을 통해 이와 같은 동시성 문제를 해결할 수 있습니다.본 포스팅에서는 멀티 스레드 환경에서 발생할 수 있는 문제에 대해 설명하고 이를 해결할 수 있는 sychronized, volatile 키워드와 Atomic Type에 대한 내용을 다루겠습니다. 가시성 문제가시성 문제란, 여러 개의 스레드가 사용됨에 따라, CPU.. 2025. 2. 11. [Java] 제네릭(Generic) 이란? 제네릭 (Generics) 이란자바에서 제네릭(Generics)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 객체별로 다른 타입의 자료가 저장될 수 있도록 한다.즉, 제네릭은 클래스와 인터페이스, 그리고 메소드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있도록 하며, 타입 파라미터는 코드 작성 시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해준다. 자바에서 배열과 함께 자주 쓰이는 자료형이 리스트(List)인데, 다음과 같이 클래스 선언 문법에 꺾쇠 괄호 로 되어있는 코드 형태를 한번 쯤은 봤을 것이다.ArrayList list = new ArrayList();저 꺾쇠 괄호가 바로 제네릭이다. 괄호 안에는 타입명을 기재한다. 그러면 저.. 2025. 1. 31. [Java] 스레드 생명주기와 스케줄링 스레드 상태스레드는 JVM에 있어 생명체와 같습니다.스레드는 태어나고(New), 실행하고(Runnable), 잠자고(Sleep), 대기하고(Wait), 종료(Terminated)하는 등의 생명주기(Life Cycle)을 가집니다. NEW스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태입니다.Java에서 new Thread()에 의해 스레드 객체가 생성되면 NEW 상태가 됩니다. NEW 상태의 스레드는 스케줄링 되지 않기 때문에 실행될 수 없는 상태입니다.스케줄링이 뭔가요?JVM이 RUNNABLE(준비) 상태인 스레드 중에서 하나를 선택하여 실행시키는 과정입니다.이렇게 선택된 스레드는 CPU의 자원을 할당받아 실제로 실행됩니다. 원래 자바 스레드는 비선점으로 스케줄링을 합니다.하지만, Windo.. 2025. 1. 28. 이전 1 2 3 4 다음