Java (73) 썸네일형 리스트형 [JAVA] ExecutorService - graceful shutdown 보호되어 있는 글입니다. [JAVA] Executor 프레임워크 0. 들어가기 전실무에서 스레드를 직접 생성해서 사용하면 다음과 같은 3가지 문제가 있습니다.스레드 생성 시간으로 인한 성능 문제스레드 관리 문제Runnable 인터페이스의 불편함1. 스레드 생성 비용으로 인한 성능 문제스레드를 사용하는 데 있어 가장 큰 문제 중 하나는 생성 비용이 매우 크다는 점입니다. 스레드를 생성하면 단순히 자바 객체를 하나 만드는 수준이 아니라, 각 스레드는 자신만의 호출 스택(call stack)을 가지며 이 메모리를 별도로 할당해야 합니다. 또한 운영체제 커널 수준에서 시스템 콜(system call)을 통해 스레드를 생성하기 때문에 CPU와 메모리 리소스를 많이 사용하게 됩니다. 생성된 스레드는 운영체제의 스케줄러에 등록되어 관리되며, 실행 순서를 조정받는 과정에서도 추가적.. [JAVA] 동시성 컬렉션 0. 들어가기 전멀티스레드 환경에서 하나의 컬렉션 인스턴스를 여러 스레드가 동시에 사용해야 할 때가 많습니다. 예를 들어, 여러 사용자의 요청을 하나의 ArrayList 에 추가하거나, 공유된 큐에서 작업을 꺼내는 구조가 있을 수 있습니다. 그런데 여기서 중요한 질문이 하나 생깁니다.바로 "자바의 컬렉션들은 기본적으로 스레드 세이프할까?" 라는 점입니다. 특히 java.util 패키지에 포함된 대표적인 컬렉션들인 ArrayList, HashMap, LinkedList 같은 클래스들은 여러 스레드가 동시에 접근해도 문제가 없을까요?참고로 여러 스레드가 동시에 접근해도 괜찮은 경우를 스레드 세이프(Thread Safe)하다고 합니다. 하지만 컬렉션 프레임워크가 제공하는 대부분의 연산은 원자적이지 않습니다. .. [JAVA] 원자적 연산 컴퓨터 과학에서 원자적 연산(atomic operation)은 더 이상 나눌 수 없는 최소 단위로 수행되는 연산을 의미합니다. 즉, 연산이 중간에 중단되지 않고 완전히 실행되거나 전혀 실행되지 않는 특성을 가지고 있습니다. 이러한 원자적 연산은 멀티스레드 환경에서 다른 스레드의 간섭 없이 안전하게 처리되어 데이터의 일관성과 무결성을 보장합니다. 원자적 연산은 동기화나 락 없이도 안전한 동시성 처리를 가능하게 하며, 예를 들어 변수에 대한 단일 읽기 또는 쓰기, CPU가 지원하는 특정 명령어 등이 있습니다. 예를 들어서 다음과 같은 필드가 있을 때volatile int i = 0; // 오른쪽의 값 1 을 왼쪽 변수 i 에 대입한다.i = 1; 은 둘로 쪼갤 수 없는 원자적 연산입니다.이 연산은 한 번에 .. [JAVA] ReentrantLock 0. 들어가기 전자바에서 멀티스레드 환경에서의 동기화를 위해 가장 기본적으로 제공되는 도구는 synchronized 키워드입니다.자바 1.0부터 제공되어 왔으며, 문법적으로 간단하고 자동으로 락 해제까지 지원해주는 매우 편리한 기능입니다.하지만 synchronized 는 다음과 같은 한계점을 가지고 있었습니다. ❌ synchronized의 한계점1) 무한 대기BLOCKED 상태에 있는 스레드는 락을 획득할 때까지 무한정 기다립니다. 락을 일정 시간까지만 기다리는 타임아웃 기능이 없으며, 인터럽트로 대기 상태를 해제할 수도 없습니다.2) 공정성 부족락이 해제되었을 때 어떤 스레드가 락을 먼저 획득할지는 보장되지 않습니다. 심할 경우, 특정 스레드는 오랫동안 락을 획득하지 못하는 상황이 발생할 수 있습니다... [JAVA] synchronized 동기화 0. 들어가기 전멀티스레드를 사용할 때 가장 주의해야 할 점은, 같은 자원(리소스)에 여러 스레드가 동시에 접근할 때 발생하는 동시성 문제 (concurrency issue)입니다. 이처럼 여러 스레드가 동시에 접근하는 자원을 공유 자원(shared resource)이라고 하며, 대표적으로는 클래스의 인스턴스 필드(멤버 변수)가 이에 해당합니다. 멀티스레드 환경에서는 이러한 공유 자원에 대한 접근을 적절히 동기화(synchronization) 하지 않으면, 예기치 않은 결과나 데이터 불일치 문제가 발생할 수 있습니다. 동시성 문제가 실제로 어떤 상황에서 발생하는지 이해하기 위해, 간단한 은행 출금 예제를 통해 살펴보겠습니다.이 인터페이스는 은행 계좌에서 출금 기능을 제공하며, 다음 두 가지 메서드를 포함.. [JAVA] happens-before 관계 자바 메모리 모델(Java Memory Model) Java Memory Model(JMM)은 자바 프로그램이 어떻게 메모리에 접근하고 수정할 수 있는지를 규정하며, 특히 멀티 스레드 프로그래밍에서 스레드 간의 상호작용을 정의 한다. JMM에 여러가지 내용이 있지만, 핵심은 여러 스레드들의 작업 순서를 보장하는 happens-before 관계에 대한 정의다. ✏️ happens-beforehappens-before 관계는 자바 메모리 모델에서 스레드 간의 작업 순서를 정의하는 개념이다. 만약 A 작업이 B 작업보다 happens-before 관계에 있다면, A 작업에서의 모든 메모리 변경 사항은 B 작업에서 볼 수 있다. 즉, A 작업에서 변경된 내용은 B 작업이 시작되기 전에 모두 메모리에 반영된다.h.. [JAVA] volatile과 메모리 가시성 👀 메모리 가시성동시에 여러 스레드가 동작하는 멀티스레드 환경에서는 하나의 변수를 여러 스레드가 읽고 쓰는 일이 자주 발생한다.그런데 간단해 보이는 코드에서도, 특정 스레드가 변경한 값이 다른 스레드에서는 반영되지 않는 이상한 현상을 겪은 적이 있을 것이다.이런 상황은 단순한 코드 실수가 아니라 "메모리 가시성(Memory Visibility)" 문제에서 비롯되는 경우가 많다.자바에서는 이런 문제를 해결하기 위한 도구로 volatile 키워드를 제공한다.그렇다면 과연 volatile은 어떤 역할을 하며, 언제 사용해야 할까?public class VolatileFlagMain { public static void main(String[] args) { MyTask task = new .. [JAVA] 스레드 제어와 생명 주기 Thread 클래스Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다.Thread 클래스가 제공하는 메서드를 이용해 main 스레드의 정보들을 확인해보자.1. 스레드 객체 정보Thread mainThread = Thread.currentThread();System.out.println("mainThread = " + mainThread);Thread 클래스의 toString() 메서드는 스레드 ID, 스레드 이름, 우선순위, 스레드 그룹을 포함하는 문자열을 반환한다.출력: Thread[#1,main,5,main]2. 스레드 ID System.out.println("mainThread.getId() = " + mainThread.getId());threadId(): 스레드의 고유 식별자를 반환.. [JAVA] 스레드 생성과 실행 방법 자바 메모리 구조Java에서 스레드를 이해하려면, 먼저 자바의 메모리 구조를 간단히 짚고 넘어갈 필요가 있습니다.자바 프로그램이 실행되면 JVM은 여러 영역으로 메모리를 나누어 각기 다른 역할을 수행합니다.이 구조는 스레드가 어떤 메모리를 공유하고, 어떤 메모리를 개별적으로 갖는지를 이해하는 데 중요한 기반이 됩니다.이제 자바의 기본적인 메모리 구성부터 살펴보겠습니다.메서드 영역(Method Area): JVM이 프로그램에 필요한 클래스 정보를 모아두는 공간으로, 모든 스레드가 공유합니다.클래스 정보: 클래스 이름, 상속 관계, 메서드 및 필드 정보 등바이트코드: 메서드 및 생성자의 실행 코드static 변수: 모든 인스턴스가 공유하는 static 필드런타임 상수 풀: 문자열 리터럴 및 컴파일 시 생성된.. 이전 1 2 3 4 ··· 8 다음