실시간 강의
24. 쓰레드 01/16 (1) - 패스트캠퍼스 백엔드 부트캠프 3기
gkss2tpt
2025. 1. 16. 12:15
1. 멀티쓰레드
- 장점
- 작업이 분리되어 코드가 간결해 진다.
- 단점
- 동기화에 주의해야 한다.
- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.
2. 데몬쓰레드
- 일반 쓰레드의 작업을 돕는 보조적인 역할
- 일반 쓰레드가 모두 종료되면 자동 종료
void suspend() 쓰레드를 일시정지 시킨다.
void resume() suspend() 에 의해 일시정지된 쓰레드를 실행대기상태로 만든다.
void stop() 쓰레드를 즉시 종료시킨다.
3. Lock & Condition
- wait() 으로 대기중인 쓰레드의 구역을 나눠준다.
// lock : 1, unlock : 0
ReentrantLock //재진입이 가능한 lock. 가장 일반적인 베타 lock(Mutex)
// 읽기lock : 1~n, 쓰기lock : -1, unlock : 0
// 여러사람이 읽을 수 있는 lock
ReentrantReadWriteLock //읽기에는 공유적이고, 쓰기에는 배타적인 lock
StampedLock // ReentrantReadWriteLock에 낙관적인 lock의 기능을 추가
- 재진입 : 같은 객체에 대한 락을 가지고 있으면 다른 동기화 블럭도 락을 다시 얻지않고 들어갈 수 있다.
- 낙관적인 lock : 일단 무조건 저지르고 나중에 확인 (일단 읽고 Lock을 확인)
- 읽기 카운트가 계속 올라가면 Write가 계속 기다려야 하는데, 낙관적인 lock은 카운트 증가가 없음
- Copy Of Read : 읽을 때는 복사본을 주고 쓰기를 할 때는 원본을 준다.
lock.lcok();
// 임계 영역
lock.unlock();
lock.lock();
try{
// 임계 영역
} finally{
lock.unlock();
}
4. volatile
- cache와 메모리간의 불일치 해소
- 휘발성, 자주 바뀜
- 여러 쓰레드가 공유하는 변수에는 volatile을 붙여야 항상 메모리에서 읽어옴
5. fork & join 프레임웍
- 작업을 여러 쓰레드가 나눠서 처리하는 것을 쉽게 해준다.