J-C-05 가상 스레드 시대의 동기화 정리 synchronized volatile LockSupport까지 한 번에

글 정보
카테고리
Programming/Java/Core
태그
JavaLevel2

가상 스레드가 바꾸려는 문제

기존 커널 스레드의 비용

가상 스레드의 핵심 아이디어

오해하기 쉬운 포인트

멀티스레드에서 제일 중요한 것

OS 동기화 객체와 자바 동기화의 연결

synchronized 메서드가 의미하는 것

synchronized void testFunc()

synchronized가 보장하는 것

“메서드에 원자성을 부여한다” 문장 보정

모니터 락 Monitor Lock 동작 흐름

공정성 우선순위에 대한 보정

synchronized 블록 예제

class Counter {
    private int value = 0;
    void inc() {
        synchronized (this) {
            value++;
        }
    }
    int get() {
        synchronized (this) {
            return value;
        }
    }
}

synchronized가 적용되는 대상

인스턴스 synchronized가 “안 먹는” 대표 케이스

static synchronized가 필요한 케이스

class GlobalCounter {
    private static int value = 0;
    static synchronized void inc() {
        value++;
    }
}

동기화는 누가 책임져야 하나

Non blocking 동기화와 Spin 개념

Spin Lock의 정확한 의미

AtomicInteger는 왜 빠른가

import java.util.concurrent.atomic.AtomicInteger;
class Stats {
    private final AtomicInteger count = new AtomicInteger(0);
    void inc() {
        count.incrementAndGet();
    }
}

synchronized vs Atomic 선택 기준

ReentrantLock은 언제 쓰나

ReentrantLock의 장점

기본 패턴은 try finally 입니다

import java.util.concurrent.locks.ReentrantLock;
class BankAccount {
    private final ReentrantLock lock = new ReentrantLock();
    private int balance = 0;
    void deposit(int amount) {
        lock.lock();
        try {
            balance += amount;
        } finally {
            lock.unlock();
        }
    }
}

tryLock 패턴 예시

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
class Cache {
    private final ReentrantLock lock = new ReentrantLock();
    private int value = 0;
    boolean updateIfPossible(int next) throws InterruptedException {
        if (lock.tryLock(10, TimeUnit.MILLISECONDS)) {
            try {
                value = next;
                return true;
            } finally {
                lock.unlock();
            }
        }
        return false;
    }
}

대기와 알림 wait notify

대표 위험

LockSupport는 왜 유용한가

LockSupport 기본 예시

import java.util.concurrent.locks.LockSupport;
class Signal {
    private volatile boolean ready = false;
    void await() {
        while (!ready) {
            LockSupport.park();
        }
    }
    void signal(Thread t) {
        ready = true;
        LockSupport.unpark(t);
    }
}

데드락은 최악의 논리 오류

락 순서 데드락 예시

class Deadlock {
    private final Object lockA = new Object();
    private final Object lockB = new Object();
    void aThenB() {
        synchronized (lockA) {
            synchronized (lockB) {
                // work
            }
        }
    }
    void bThenA() {
        synchronized (lockB) {
            synchronized (lockA) {
                // work
            }
        }
    }
}

가상 스레드와 동기화 실전 팁

최종 정리