•
동시성과 병렬성의 차이점을 말해주세요.
◦
동시성은 싱글 코어에서 논리적으로 여러 작업을 동시에 처리하는 것을 말합니다.
▪
시간 분할이나 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> : 객체 참조에 대한 원자 연산