728x90
반응형

JAVA 266

[JAVA] 스레드와 wait()와 notify() 상호작용

1️⃣ 상황 설정공유 객체 obj가 있음 → 모니터 포함두 스레드: Thread A(생산자), Thread B(소비자)목적: Thread A가 데이터를 생산하면 Thread B가 소비2️⃣ 모니터 구조 그림 [Object obj] ┌──────────────┐ │ Monitor │ │ ┌────────┐ │ │ │ Lock │ │ ← 현재 락 소유 스레드 │ └────────┘ │ │ ┌────────┐ │ │ │ Wait Q │ │ ← wait() 호출 스레드 대기 큐 │ └────────┘ │ └──────────────┘Lock: 현재 객체의 모니터를 점유한 스레드Wait Q: wait() 호출로 대기 중인 스레드 목록3️⃣ 실행 흐름 예제 class Shared { p..

JAVA 2025.10.02

[JAVA] 모니터(Monitor)

1️⃣ 모니터(Monitor)란?정의: 한 객체에 대한 동기화 제어 장치역할: 멀티스레드에서 한 번에 하나의 스레드만 객체를 사용하게 관리쉽게 말해 “객체에 걸린 자물쇠(lock)” 같은 존재예요.💡 모든 객체는 Java에서 모니터를 가지고 있음 → 스레드가 synchronized로 접근할 때 이 모니터를 사용2️⃣ 모니터 동작스레드가 synchronized(obj) 블록에 들어가면 → obj의 모니터 락을 획득모니터를 가진 스레드만 블록 안 코드를 실행 가능블록 종료 시 → 락 해제, 다른 스레드가 접근 가능wait()를 호출하면 → 락을 풀고 대기 → 다른 스레드 접근 가능notify()를 호출하면 → 대기 중인 스레드 중 하나를 깨움, 락이 해제될 때까지 기다림3️⃣ 그림으로 이해[Object o..

JAVA 2025.10.01

[JAVA] synchronized 블록

Java에서 synchronized는 멀티스레드 환경에서 공유 자원을 안전하게 다루기 위해 사용하는 키워드예요. 1️⃣ 기본 개념멀티스레드 문제: 여러 스레드가 동시에 같은 자원(변수, 객체 등)에 접근하면 데이터가 꼬이거나 예상치 못한 결과가 발생할 수 있어요.해결책: synchronized를 사용해서 한 번에 하나의 스레드만 접근하도록 제한.락(Lock): synchronized는 내부적으로 **객체의 모니터(lock)**를 사용해 스레드 접근을 제어합니다.2️⃣ synchronized 사용 방법2-1. 메서드에 적용public synchronized void increment() { count++; // 한 스레드만 접근 가능}이렇게 하면 increment() 메서드 전체가 동기화됩니다.장점..

JAVA 2025.09.29

[JAVA] Object.wait()

Java에서 wait()는 모든 객체에 있는 메서드라는 점을 기억해야 합니다. 즉, Object 클래스에 정의되어 있어서 모든 객체에서 호출 가능합니다. 하지만 단순히 obj.wait()라고 하면 조금 복잡한 동작 원리가 있어요. 1️⃣ 기본 개념목적: 스레드를 일시 정지시키고, 다른 스레드가 해당 객체의 상태를 변경할 때까지 기다리게 하는 것.위치: java.lang.Object 클래스에 정의됨.조건: wait()를 호출할 때, 반드시 해당 객체의 모니터(락)을 소유하고 있어야 함 (즉, synchronized 블록 안에서만 호출 가능). synchronized(obj) { obj.wait(); // obj의 모니터를 가지고 있어야 함}2️⃣ 주요 특징특징설명모니터 필요wait()는 반드시 sy..

JAVA 2025.09.25

[JAVA] Thread.sleep()

Thread.sleep() 은 자바(Java) 에서 현재 실행 중인 스레드를 일정 시간 동안 일시 정지(대기) 시키는 메서드예요. 📌 기본 형식Thread.sleep(long millis) throws InterruptedException millis : 멈출 시간(밀리초 단위, 1초 = 1000ms)오버로드된 버전으로 나노초 단위까지 받을 수도 있습니다:Thread.sleep(long millis, int nanos) throws InterruptedException📌 동작 방식호출한 스레드는 지정된 시간 동안 실행 상태(Running) 에서 일시 정지(Timed Waiting) 상태로 전환됩니다.지정된 시간이 지나면, 다시 Runnable(실행 대기) 상태로 돌아가고, CPU 스케줄러가 잡아주면 ..

JAVA 2025.09.24

[JAVA] 람다식 표현을 메서드 참조 방식으로 변경하기 + 장점

✅ 1. 메서드 참조로 변환 예제 유형람다식메서드 참조설명정적 메서드 참조x -> Math.abs(x)Math::abs클래스의 static 메서드를 참조인스턴스 메서드 (특정 객체)s -> s.toLowerCase()String::toLowerCase인스턴스 메서드 참조인스턴스 메서드 (임의 객체)x -> x.equals("A")"A"::equals특정 값의 메서드를 참조생성자 참조() -> new ArrayList()ArrayList::new생성자를 참조배열 생성자size -> new int[size]int[]::new배열 생성자 참조✅ 예제 코드📌 예제 1: forEach에서 출력// 람다식list.forEach(item -> System.out.println(item));// 메서드 참조list...

JAVA 2025.05.09

[JAVA] 특정 값 배열에 포함되는지를 체크 (JAVA8 이후)

if (Stream.of("1", "2", "6", "7", "10").anyMatch(code -> code.equals(crchTp))) { contractMngService.updateCrItems();}이 방식은 다음과 같은 장점이 있습니다:Stream.of(...)로 배열처럼 여러 값을 처리 가능anyMatch(...)로 조건에 맞는 값이 하나라도 있는지 체크 가능가독성이 좋고 함수형 프로그래밍 스타일에 적합단, 이 방식은 Arrays.asList(...).contains(...)에 비해 성능 차이는 거의 없으며, 코드 스타일의 선호에 따라 선택. [메서드 참조 방식으로 변경]if (Stream.of("1", "2", "6", "7", "10").anyMatch(crchTp::equals)..

JAVA 2025.05.08
728x90
반응형