🧩 BE
home

Java (동시성 프로그래밍 기초)

동시성과 병렬성의 차이점을 말해주세요.
동시성은 싱글 코어에서 논리적으로 여러 작업을 동시에 처리하는 것을 말합니다.
시간 분할이나 Context Switching 등을 빠르게 해서 동시간에 여러 작업이 처리되는 것처럼 보이는 것을 말합니다.
병렬성은 멀티 코어에서 물리적으로 여러 작업을 동시에 실행하는 것을 말합니다.
멀티 코어 환경에서 여러 코어가 진짜 동시에 여러 작업을 한꺼번에 처리하는 것을 말합니다.
Thread-Safe하다는 것이 무슨 의미인가요?
멀티스레딩 환경에서 여러 스레드가 동시에 접근해도, 동기화 문제 없이 올바르게 동작하는 코드나 객첼를 말합니다.
즉, race condition이나 데이터 정합성 문제가 발생하지 않도록 설계된 구조를 말합니다.
가시성 문제와 원자성 문제에 대해 설명해 주세요.
가시성 (Visibility)
한 스레드가 변경한 변수 값을 다른 스레드가 즉시 볼 수 없는 문제
CPU 캐시와 메인 메모리 간의 동기화 문제
원자성 (Atomicity)
하나의 작업이 더 이상 나눠지지 않고, 중간에 끼어들 수 없는 실행 단위
ex) count++ 는 내부적으로 read → add → write로 3단계. 원자적이지 않음
자바의 동시성 이슈를 해결하는 방법을 아는만큼 설명해 주세요.
synchronized 키워드 - 임계 영역을 동기화 해서, 한 번에 하나의 스레드만 접근하게 만드는 방법
volatile 키워드 - 변수의 가시성을 보장해서 캐시와 메모리를 동기화 하는 방법
Atomic 클래스 - 원자적 연산을 보장하는 방법
Lock 인터페이스 - race condition 해소하여 동시성 제어
Concurrent 패키지 - ConcurrentHashMap, CopyOnWriteArrayList 등 Thread-safe 한 자료구조를 활용하는 방법
volatile 키워드가 무엇인가요?
Java 변수를 메인 메모리에 저장 중으로 표시하기 위해 사용
휘발성 변수의 모든 읽기는 CPU 캐시가 아닌 컴퓨터의 메인 메모리에서 읽혀지며, 휘발성 변수에 대한 모든 쓰기도 CPU 캐시뿐만 아니라 메인 메모리에 기록되는 것.
때문에 가시성을 보장
플래그 변수나, 단순 상태 공유에 활용
synchronized 키워드가 무엇인가요?
동기화 블록이나 메서드에 사용해서 해당 메서드를 실행하기 위해 하나의 스레드만 진입 가능함을 보장하기 위해서 사용되는 키워드.
가시성과 원자성을 둘 다 보장
synchronized의 문제점은 무엇이 있나요?
락 경쟁으로 인해 Context Switching이 증가해서 성능 저하
두개 이상의 스레드가 락을 기다리면서 데드락 발생 가능성이 있음
synchronized는 기본적으로 락을 먼저 요청한 스레드가 먼저 얻는다는 보장이 없어서 한 스레드가 락을 계속 선점하며 공정성(Fairness)이 보장되지 않음
synchronized, ReentranctLock은 재진입 가능한 구조라 같은 스레드가 동일한 락을 여러 번 획득할 수 있습니다. 하지만, 임계영역이 너무 길어지면, 다른 스레드가 그 리소스를 너무 오래 기다려서 성능 저하나 락 경합이 심해집니다.
synchronized는 어떻게 구현되어 있나요?
JVM 수준에서 모니터 락을 사용
Object Header에 존재하는 Mark Word를 활용
상태별로 경량 → 중량 락 등 락 최적화 적용
atomic하다는 것이 무슨 의미인가요?
하나의 연산 단위로 쪼갤 수 없고, 중간에 다른 작업이 끼어들 수 없음을 의미합니다.
Thread간 간섭 없이 안정하게 연산됨을 보장한다는 뜻
atomic 타입이 무엇인가요?
Java의 atomic 패키지에 존재
내부적으로 CAS(Compare-And-Swap) 기법 사용해서 원자적 연산
AtomicInteger : int 타입 원자 연산
AtomicBoolean : boolean 타입 원자 연산
AtomicReference<T> : 객체 참조에 대한 원자 연산