'Thread'에 해당되는 글 1건

  1. 2008.05.14 자바관련 잡다한 이야기 - 스레드의 동기화 문제 1

Thread.sleep()이라는 정적 메소드는 적어도 sleep 메소드에 전달된 인자로 지정한 시간 동안 스레드를 실행중인 상태를 떠나있게 만든다. 값에 100을 주면 100밀리세컨드 동안 스레드가 멈춘다.

sleep()메소드에서는 확인 예외(interruptedException)를 던지기 때문에 sleep()을 호출할 때에는 반드시 try/catch로 감싸거나 예외를 선언해야 한다.

스레드 두 개 이상이, 힙에 있는 동일한 객체를 접근하는 경우에 심각한 문제가 생길 수 있습니다.
 
스레드를 두 개 이상에서 똑같은 객체에 접근하면 데이터가 엉망이 될 수 있다. 예를들어, 한 스레드가 객체의 중요한 상태를 조작하는 도중에 실행중인 상태에서 벗어나면 심각한 문제가 생길 수 있다.

스레드를 사용할 때도 객체를 안전하게 만들고 싶다면 어떤 선언문들이 원자적인 절차로 처리되어야 하는지 결정해야 한다. 즉 다른 스레드가 같은 객체의 같은 메소드에 들어가기 전까지 끝까지 실행되어야만 하는 메소드를 결정해야 한다.

스레드 두개가 메소드 하나에 동시에 들어가는 일을 방지하고 싶다면 메소드 선언부에 synchronized 키워드를 추가해야 한다.

모든 객체에는 자물쇠가 하나씩 있으며 그 자물쇠에는 열쇠가 하나뿐이 없다. 대부분의 경우에 그 자물쇠에 대해서 신경을 쓸 필요가 없지만 객체에 동기화된 메소드가 있으면 자물쇠가 중요한 역할을 한다.

스레드에서 어떤 동기화된 메소드로 들어가려면 그 객체에 대한 열쇠가 있어야 한다. 열쇠가 없으면 그 스레드는 대기실 같은 공간으르 들어가서 열쇠를 슬 수 있을 때 까지 기다려야 한다. 이는 운영체제의 세마포와 비슷하다.

객체에 동기화된 메소드가 두개 이상 있어도 열쇠는 여전히 하나뿐이 없다. 어떤 스레드가 그 객체에 동기화된 메소드에 들어가면 다른 어떤 스레드도 같은 객체에 있는 동기화된 메소드에 들어갈 수 없다. 이런 제한이 있어야 데이터를 조작하는 모든 메소드를 동기함으로 데이터를 보호할 수 있다.

Posted by 서오석
,