2013년 1월 21일 월요일

[Java] 스레드간 커뮤니케이션의 필요성

각각의 스레드가 독립적으로 실행 될 때, 즉 서로가 서로에게 어떤 영향을 주지 않는 상황일 때는 전혀 문제가 발생하지 않는다.

하지만 같은 영역의 데이터를 읽거나 쓰게 될 때 두 스레스가 동시에 접근하여 사용한다면 문제가 발생하게 된다. 이 부부을 critical section이라고도 한다.

예를 들어 두 개의 스레드가 실행되고 있고 이 스레드들을 하나의 변수에 공동으로 접근하여 그 수를 하나씩 증가 시킨다고 하자.
그런 상황에서는 당연히 서로의 스레드가 자신에게 주어진 횟수만큼 데이터를 증가시키고 스레드를 종료할 거라고 생각할 것이다. 그러나 결과는 그렇지 않다.



 그 이유는 하나의 스레드가 데이터를 읽어와 그 데이터의 값을 하나 증가시키기전에 다른 스레드에서 데이터를 증가 시켜버렸다면 두 스레드가 함께 증가시켜야 할만큼의 값의 증가는 일어나지 못하게 되는 것이다.

 그렇다면 어떻게 이러한 문제점을 해결할 수 있을까?
첫번째 방법 : boolean을 활용하여 하나의 스레드가 작동 중일때 false로 flag를 표시하여 다른 스레드의 접근을 막아두는 것이다. 그러나 근본적인 해결 방법은 아니다. 왜냐면 boolean을 너무 자주 참조하여 비효율적이기 때문이다.

두번째 방법 : 동기화(synchronization)이다! 이 동기화를 통해 스레드간의 원활한 커뮤니케이션이 되도록 제어할 수 있다.

댓글 없음:

댓글 쓰기