본문 바로가기

전체 글

(382)
[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 필드런타임 상수 풀: 문자열 리터럴 및 컴파일 시 생성된..