Thread?
- process: 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨.
- thread: 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread임.
Multi-threading
- 여러 스레드가 동시에 수행되는 프로그래밍.
- 스레드는 각각 자신만의 작업 공간을 가짐 (context)
- 각 스레드 사이에서 공유하는 자원이 있을 수 있음 (static instance)
- 여러 thread가 자원을 공유하여 작업이 수행되는 경우, race condition이 발생할 수 있음.
- 이렇게 여러 쓰레드가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section이라고 부름.
- critical section에 대한 동기화를 구현하지 않으면 오류가 발생할 수 있음.
쓰레드 사용 방법
- 직접적으로 extends Thread로 상속받아 사용하거나
- Runnable을 implements해서 사용하는 방법이 있다.
우선순위 배정에 따라서 쓰레드의 동작 순서를 조정할 수 있다.
join()
- 동시에 여러개의 쓰레드가 실행 될 때 다른 쓰레드의 결과를 참조해서 실행해야 하는 경우 join()을 사용.
- join()을 호출한 쓰레드는 join()으로 부른 쓰레드의 수행이 끝나기 전까지 not-runnable한 상태가 됨.
interrupt()
- 쓰레드가 join(), sleep(), wait() 에 의해 not-runnalbe한 상태일 때 interrupt()를 호출하면 다시 runnable 해짐.
멀티 쓰레드에서의 동기화
- critical section과 semaphore
- critical section은 두 개 이상의 쓰레드가 동시에 접근할 수 없게 만든 영역이다.
- semaphore는 특별한 객체이며 get/release 두 개의 기능이 있다.
- 한 순간 오직 하나의 쓰레드만이 세마포를 얻을 수 있고, 나머지 쓰레드는 대기(blocking) 상태가 된다.
- 세마포를 얻은 쓰레드만이 critical section에 들어갈 수 있다.
동기화
- 두 개의 쓰레드가 같은 객체에 접근할 경우, 에러 발생.
- 동기화는 critical section에 접근한 경우, 공유 자원(shared resources)에 lock을 걸어서 다른 쓰레드의 접근을 제어함.
- 동기화를 잘못 구현하면 deadlock에 걸릴 수 있다.
자바에서는 synchronized 메서드나 synchronized 블럭을 사용한다.
- Synchronized 블럭
- 현재 객체 또는 다른 객체를 lock으로 만든다.
synchronized(참조형 수식) { 수행문; }
- 현재 객체 또는 다른 객체를 lock으로 만든다.
- synchronized 메서드
- 객체의 메서드에 synchronized 키워드 사용
- 현재 이 메서드가 속해있는 객체에 lock을 건다.
- 자바는 deadlock을 방지하는 기술이 제공되지 않기 때문에 되도록이면 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않는 것이 좋다..
'Backend > JAVA' 카테고리의 다른 글
필터와 인터셉터 (0) | 2024.03.07 |
---|---|
디자인 패턴 (2) | 2024.03.07 |
데코레이터 패턴 (0) | 2024.03.05 |
자바의 reduce() (0) | 2024.03.04 |
자바의 비선형 자료구조 (0) | 2024.03.04 |