Java 24

Java > Concurrency > 6. Memory visibility

메모리 가시성멀티 쓰레드 환경에서 한 쓰레드가 변경한 값이 다른 쓰레드에게 언제, 어떻게 보여지는지에 대한 문제를 말한다여러 쓰레드가 공유된 하나의 메모리에 접근할 때 이 문제가 발생한다 volatile 키워드를 사용해 문제를 해결할 수 있다https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadVolatileTest.java 쓰레드 동기화 기법을 사용할 수도 있다https://github.com/venzersiz/learn-java8/tree/master/src/test/java/concurrency/synchorize  Java Memory Model여러 쓰레드들이 메모리를 공유하고 상호작용하..

Java/Concurrency 2024.09.13

Java > Checked 예외의 재정의

자바의 메서드 재정의 시 규칙Checked(이하 검사) 예외부모 메서드가 검사 예외를 던지지 않으면 재정의된(Overrided) 자식 메서드도 예외를 던질 수 없다자식 메서드는 부모 메서드가 던질 수 있는 검사 예외의 하위 타입만 던질 수 있다Runtime 예외제약없음 대표적으로 Runnable 인터페이스의 메서드 시그너처는 다음과 같다public abstract void run(); 따라서 Runnable 인터페이스를 구현한 클래스가 run() 메서드를 재정의할 때 검사 예외를 던지면 컴파일 에러가 발생한다 Thread 클래스도 Runnable 인터페이스를 구현하고 있으므로 위 제약이 동일하게 적용된다

Java/Java > Basics 2024.09.09

Java > Concurrency > 3. Thread info

쓰레드는 다음과 같은 속성을 가진다idnamestateprioritythreadGroup https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadInfoTest.java  Thread priority쓰레드는 우선순위를 가지며, 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다 작업의 중요도에 따라 쓰레드 우선순위를 다르게 설정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다 예를 들어 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 전송 쓰레드의 우선순위가 높아야 채팅이 원활할 것이다(대신 다운로드는 더 오래 걸릴 것이다). 이처럼 UI 관련 쓰레드는 다른 쓰레드보다 우선 순위..

Java/Concurrency 2024.09.05

Java > Memory structure

Run-time data areashttps://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5Method area모든 JVM 쓰레드가 공유 클래스별 구조를 저장런타임 상수 풀(Pool)공통 리터럴 상수클래스 정보클래스의 실행(바이트) 코드필드, 메서드 데이터메서드와 생성자 코드static 영역static 변수 보관 논리적으로 Heap의 부분 메서드 영역의 메모리가 할당 요청을 충족시키지 못하면 JVM은 OutOfMemoryError를 던진다JVM stacks각각의 JVM 쓰레드는 생성될 때 자기만의 스택을 가진다 JVM 스택은 Frame을 저장한다 JVM 스택은 C같은 전통적인 언어의 스택과 유사하다(Stack) frame스택 영역에 쌓..

Java/Java > Basics 2024.09.04

Java > Concurrency > Thread scheduling

스케줄링CPU에 어떤 프로그램이 얼마의 시간동안 실행될지를 OS가 결정하는 것 단순히 시간으로만 작업을 분할하지는 않고 다양한 우선순위와 최적화 기법을 사용한다 동작 예OS는 내부에 스케줄링 큐를 가지고 있고 쓰레드들은 큐에서 대기한다OS는 큐에서 쓰레드 A를 꺼내 CPU를 통해 실행한다OS는 쓰레드 A를 잠시 멈추고 큐에 다시 넣는다OS는 쓰레드 B를 꺼내 CPU를 통해 실행한다이러한 과정을 반복한다 CPU core가 2개 이상이면 위 작업을 물리적으로 동시에 실행할 수 있다

Java/Concurrency 2024.09.03

Java > Concurrency > 4. Thread methods

쓰레드 프로그래밍이 어려운 이유는 동기화와 스케줄링 때문이다 효율적인 멀티 쓰레드 프로그램을 만들기 위해서는 보다 정교한 스케줄링을 통해 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비 없이 잘 사용하도록 프로그래밍 해야 한다 스케줄링을 위해 쓰레드의 상태와 상태 변경 메서드를 학습할 필요가 있다. 쓰레드의 상태는 아래 글에 설명해두었다2024.09.05 - [Java/Concurrency] - Java > Concurrency > 3. Thread info  Thread 클래스의 메서드void stop(), void suspend(), void resume()교착상태를 일으키기 쉽게 작성되어 있어, 사용자제(@Deprecated) 메서드로 정해졌다 해당 API를 사용하지 말고 아래와 같이 유사 기..

Java/Concurrency 2024.08.30

Java > Concurrency > 5. Daemon thread

명명 이유Daemon다이몬(고대 그리스 신화 속에 나오는 반신 반인의 존재) 신화에서 데몬은 신과 인간 사이의 중간적 존재로서 보이지 않게 활동하며 일상적인 일을 도왔다. 이를 차용하여 CS에서는 사용자에게 직접적으로 보여지지 않으면서 백그라운드로 작업을 수행하는 것을 데몬 프로세스/쓰레드라고 말한다 현대 그리스어 발음이 데몬이라 한국에서 데몬으로 읽는 것 같다  특징데몬 쓰레드는 다른 Non-daemon(일반, 사용자) 쓰레드의 작업을 돕는 보조적인 역할을 수행한다 모든 사용자 쓰레드가 종료되면 JVM도 종료된다. 이때 데몬 쓰레드도 자동 종료된다 데몬 쓰레드의 예GC워드 프로세서의 자동저장화면 자동 갱신..  코드 작성무한 반복문과 조건문을 이용해 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을..

Java/Concurrency 2024.08.29

Java > Concurrency > Context switching

Context의 사전적 뜻은 문맥이다. 여기서 문맥이라 함은 현재 작업하는 문맥을 말한다. 하나의 작업을 위해 메모리에 있는 값을 CPU가 읽고 작업 전환을 위해 CPU의 값을 다시 메모리에 저장하고, 이런 문맥을 전환하는 것을 컨텍스트 스위칭이라 한다 쓰레드 간의 작업 전환으로 인해, 단일 쓰레드로 작업한 시간보다 여러 쓰레드로 작업한 시간이 더 오래 걸리기도 한다 작업 전환 시 현재 작업의 상태(다음에 실행해야할 위치, Program Counter 등)를 저장하고 읽어 오는 시간이 소요된다 싱글 코어에서 CPU만을 사용하는 단순한 계산 작업을 할 때 오히려 싱글 쓰레드로 프로그래밍하는 것이 더 효율적이다https://github.com/venzersiz/learn-java8/blob/master/sr..

Java/Concurrency 2024.08.29

Java > Concurrency > 1. Process, Thread

Multi taskingOS가 여러 개의 프로세스를 동시에(실제로는 아주 짧은 시간에 번갈아가며) 실행하는 기술OS 소프트웨어 관점 OS의 스케줄링 기법을 사용하며 실행 단위는 프로세스가 아닌 쓰레드다  Multi processing둘 이상의 프로세서(CPU core)를 사용하여 여러 작업을 동시에(실제로 ) 처리하는 기술하드웨어 장비 관점  ProcessOS로부터 자원을 할당받아 실행 중인 프로그램 실행 중인 프로그램의 인스턴스 독립적인 메모리 공간을 가지며 서로 접근 불가 메모리 구조Code section실행할 프로그램의 코드 저장Data section전역/정적 변수 저장Heap(Memory)동적 할당 영역 Thread모든 프로세스에는 최소 하나의 쓰레드가 존재한다Stack함수 호출 시 생성되는 지역..

Java/Concurrency 2024.08.29

Java > Concurrency > 2. Thread 생성, 실행

Thread 생성https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/MakingThreadTest.java Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하는 방법이 있다 Thread 객체의 기능을 확장할 때를 제외하곤 Runnable 인터페이스를 사용하는 것이 여러모로 좋다 run() 메서드를 오버라이딩해야 한다  Thread 실행https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/MakingThreadTest.javahttps://github.com/venzersiz/learn-java..

Java/Concurrency 2024.08.23