CODEDRAGON ㆍDevelopment/Java
스레드의 동기화 문제
스레드의 동기화 문제는 다중 스레드일 때 발생가능하며 여러 스레드가 동시에 실행 될 때 2개 이상의 스레드가 동일한 데이터에 접근하여 작업할 경우 문제가 발생할 수 있습니다.
그러므로, 하나의 스레드가 조작하고 있는 공유자원(변수, 데이터)를 다른 스레드가 조작하지 못하도록 하기 위해서 동기화가 필요합니다.
동기화 문제 발생
동기화 처리
Synchronization(동기화)
· 임계영역(Critical Section)에서 스레드들이 순서를 갖춰 자원을 사용하게 하는 것을 동기화하고 합니다.
· 임계영역이란 멀티 스레드에 의해 공유자원이 서로 참조될 수 있는 코드의 범위를 말합니다.
· 즉, 한 쓰레드가 작업중 다른 쓰레드에 의해 간섭을 받지 못하도록 막는 것을 쓰레드의 동기화하고 합니다.
· 멀티 스레드 프로그램에서 임계영역을 제대로 처리하지 못 하는 경우 심각한 문제가 발생할 수 있습니다.
· 이러한 문제 상황을 해결하는 방법이 동기화를 이용하는 것입니다. 그래서 하나의 자원을 한번에 하나의 스레드만 사용하도록 하는 기술입니다.
· 동기화 메소드를 구현하기 위해서는 synchronized 키워드를 사용하여야 합니다.
· 동기화 메소드를 스레드가 호출할 경우 이미 접근한 스레드가 작업을 완료할 때까지 기다려야 접근할 수 있습니다.
· 동기화를 처리하기 위해 모든 객체에 락(lock)을 포함 시켰습니다.
· 락(lock)이란 공유 객체에 여러 스레드가 동시에 접근하지 못하도록 하기 위한 것으로 모든 객체가 힙 영역에 생성될 때 자동으로 만들어 집니다.
synchronized 흐름도
Thread 관련 용어
구분 |
설명 |
공정 (fairness) |
여러 개의 스레드가 하나의 컴퓨팅 자원을 사용하기 위해 동시에 접근하는 프로그램을 작성할 경우 모든 스레드는 공정하게 그 자원을 사용할 수 있도록 해 주어야 합니다. |
기아상태 (starvation) |
하나 또는 그 이상의 스레드가 자원을 얻기 위해 Blocked 상태에 있고, 그 자원을 얻을 수 없게 되면 다른 작업을 못하는 상태를 말합니다. |
교착상태 (deadlock) |
두 개 이상의 스레드가 만족하지 못하는 상태로 계속 기다릴 때 발생합니다. |
경쟁상태(race condition) |
여러 쓰레드가 lock(제어권)을 얻기 위해 서로 경쟁하는 상태를 말합니다. |
Thread를 사용할 경우 주의
· 가급적 공유자원 만들지 말 것.
· 공유자원을 만들 경우 반드시 적절한 방법으로 동기화 할 것.