Java 36

Java / 메모리 가시성

메모리 가시성멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지에 대한 문제 실제 메모리의 접근 방식메인 메모리는 가격ㄱ이 저렴해서 큰 용량을 쉽게 구성할 수 있지만 속도가 상대적으로 느림>> 캐시 메모리는 비싸지만 매우 빠른 메모리>> 현대 CPU 대부분은 코어 단위로 캐시 메모리를 각각 보유 Volatile캐시메모리를 사용하지 않고 값을 읽거나 쓸 때 항상 메인 메모리에 직접 접근 캐시 메모리를 사용할 떄보다 성능이 느려지는 단점 Java Memory Model자바 프로그램이 어떻게 메모리에 접근하고 수정할 수 있는지를 규정>> 특히 멀티 스레드 프로그래밍에서 스레드 간의 상호작용을 정의>> happens-before 관계 정의 happens-before자바 메모리 모델에서 그..

Java 2025.05.19

Java / 인터럽트

InterruptWAITING, TIMED_WAITING 같은 대기 상태의 스레드를 직접 깨워>> 작동하는 RUNNABLE 상태로 만듦interrupt가 발생하면 해당 스레드에 InterruptedException 발생>> 대기 상태에서 꺠어나 RUNNABLE 상태가 되고 코드 정상 수행>> InterruptedException을 catch로 잡아 정상 흐름으로 변경 Thread.interrupted()는 스레드가 interrupt 상태면 true를 반환하고 다시 상태를 false로 바로 변경>> 스레드의 interrupt 상태를 정상으로 돌리지 않으면 이후에도 계속 interrupt가 발생>> interrupt 목적을 달성하면 상태를 다시 정상으로 돌려야함 yieldThread.yield() 메서드는 ..

Java 2025.05.16

Java / 스레드 제어와 생명 주기

스레드 생명 주기New (새로운 상태)스레드가 생성되고 아직 시작되지 않은 상태>> Thread 객체가 생성되지만 start() 메서드가 호출되지 않은 상태>> Thread thread = new Thread(runnable); Runnable (실행 가능 상태)스레드가 실행될 준비가 된 상태>> 스레드는 실제로 CPU에서 실행 가능>> thread.start();>> Runnable 상태에 있는 모든 스레드가 동시에 실행되는 건 x>> 스케쥴러의 실행 대기열에 있든 CPU에서 실제 실행되고 잇든 모두 Runnable 상태 Blocked (차단 상태)스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태>> synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우 Waiting (대..

Java 2025.05.15

Java / 스레드 생성과 실행

스레드 생성 - Thread 클래스 상속스레드 객체를 생성하고 start()를 호출해야 스택 공간을 할당 받고 스레드 작동>> 이름을 주지 않으면 Thread-0처럼 임의의 이름 부여>> Thread-0는 run() 메서드의 스택 프레임을 스택에 올리면서 메서드 시작 스레드간 실행 순서는 보장 x start() vs run()run() 메서드를 직접 호출하면?별도의 스레드가 run()을 실행하는 것이 아닌 main 스레드가 run() 호출>> 별도의 스레드에서 재정의한 run() 메서드를 실행하려면 반드시 start() 호출 사용자 스레드프로그램의 주요 작업 수행작업이 완료될 때까지 실행 모든 user 스레드 종료>> JVM 종료 데몬 스레드백그라운드에서 보조적 작업 수행 모든 user 스레드 종료>> ..

Java 2025.05.12

Java / 프로세스와 스레드

멀티태스킹CPU가 매우 빠르게 두 프로그램의 코드를 번갈아 수행>> 두 프로그램이 동시에 실행되는 것처럼 느낌각 프로그램의 실행 시간을 분할해서 마치 동시에 실행되는 것처럼 하는 기법>> 시분할(Time Sharing, 시간 공유) 기법 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력>> 멀티 태스킹 CPU에 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정>> 스케쥴링 멀티 프로세싱컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용해서 여러 작업을 동시에 처리하는 기술 프로세스프로그램을 실행하면 프로세스가 만들어지고 프로그램이 실행됨>> 운영체제 안에서 실행중인 프로그램을 프로세스 프로세스>> 실행 중인 프로그램의 인스턴스>> 서로 격리되어 관리>> 다른 프로세스에 영향 x 프로세스..

Java 2025.05.11

Java / 컬렉션 프레임워크 - Map, Stack, Queue

Map키-값의 쌍을 저장하는 자료 구조>> 키는 중복될 수 없지만 값은 중복 가능>> Map은 순서를 유지하지 않음 Entry Key-Value Pair>> Entry는 키-값의 쌍으로 이루어진 간단한 객체, Map 내부에서 키와 값을 함께 묶어서 저장할 때 사용 키 목록 조회Set keySet = studentMap.keySet()>> Map의 키는 중복 허용 x>> Map의 모든 키 목록을 조회하는 keySet() 호출하면 중복 허용하지 않는 자료 구조인 Set 반환 값 목록 조회Collection values = studentMap.values()>> Map의 값은 중복 허용, Set으로 반환 불가>> 입력 순서 보장 x, List로 반환하기 애매>> 단순히 값의 모음이라는 의미의 상위 인터페이스 ..

Java 2025.03.09

Java / 컬렉션 프레임워크 - Set

Set 인터페이스중복을 허용하지 않는 유일한 요소의 집합>> 순서를 보장하지 않으며 특정 요소가 집합에 있는지 여부를 확인하는데 최적화 HashSet구현 : 해시 자료 구조를 사용해서 요소 저장순서 : 특정 순서 없이 저장시간 복잡도 : O(1)용도 : 데이터의 유일성만 중요하고 순서가 중요하지 않은 경우hashCode(), equals() 모두 사용 LinkedHashSet구현 : HashSet에 연결 리스트를 추가해서 요소들의 순서 유지순서 : 요소돌은 추가된 순서대로 유지시간 복잡도 : O(1)용도 : 데이터의 유일성과 함께 삽입 순서를 유지해야 할 경우head(first)부터 순서대로 링크를 따라가면 입력 순서대로 데이터 순회 가능양방향 연결 TreeSet구현 : 이진 탐색 트리를 개선한 레드-블..

Java 2025.03.08

Java / 컬렉션 프레임워크 - HashSet

문자열 해시 코드컴퓨터는 문자를 직접 이해하지 못하는 대신 각 문자에 고유한 숫자를 할당해서 인식 (ASCII 코드)hashCode() 메서드를 사용해서 문자열을 해시 코드로 변경>> 고유한 정수 숫자 값 (해시 코드)를 사용해서 해시 인덱스를 생성하고 이걸 배열의 인덱스로 사용 자바의 hashCode()해시 자료 구조를 사용하려면 정수로 된 숫자 값인 해시 코드가 필요자바에는 정사 뿐만 아니라 char, String, Double, Boolean등 수 많은 타입 존재, 또한 개발자가 직접 정의한 Member, User와 같은 사용자 정의 타입도 존재>> 모든 객체가 숫자 해시 코드를 제공할 수 있어야 함 Object.hashCode()자바는 모든 객체가 자신만의 해시 코드를 표현할 수 있는 기능 제공보..

Java 2025.03.08