달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

'JAVA이야기'에 해당되는 글 119

  1. 2011.11.11 동기화 클래스 구현
2011. 11. 11. 19:16

동기화 클래스 구현 JAVA이야기2011. 11. 11. 19:16

병렬프로그램에서느느 상태 기반의 조건은 다른 스레드를 통해서 언제든지 마은대로 변경될수 있다.
바로직전에 실행할 때는 비어 있던 풀에 다른 스레드가 사용하고 남은 객체가 반환되 들어오기도 한다.
병렬 객체의 상태 종속적인 메소드는 선행조건이 만족하지 않았을 때 오류가 발생하는 문제에서 비켜날 수도 있지만, 비켜나는 일보다는 선행조건을 만족할 때까지 대기하는 경우가 많아진다. 

상태종속적인 긴으을 구현할 때 원하는 선행조건이 만족할 때까지 작업을 멈추고 대기하도록 하면 조건이 맞지 않았을 때 프로그램이 멈춰버리는 방법보다 훨씬 간편하고 오류도 적게 발생한다.

자바에 내장된 조건 큐 메커니즘은 실행 중인 스레드가 특정 객체가 원하는 상태에 진입할 때까지 대기할 수 있도록 도와주며, 원하는 상태에 도달해서 스레드가 계속해서 실행할 수 있게 되면 대기 상태에 들어가 있던 스레드를 깨워주는 역할도 담당한다. 

원하는 상태에 다다를 때까지 폴링하고 잠깐 기다리고 다시 포링하고 다시 잠깐 기다리는 반복문을 사용하는 대신 조건큐를 사용하면 얼마나 많은 이득을 얻을 수 있는지를...

상태종속적인 블로킹
void blockingAction()
{
//상태변수에 대한 락 확보
while(선행조건이 만족하지 않음)
{
  //확보햇던 락을 풀어줌
  //선행조건이 만족할만한 시간만큼 대기
  //인터럽트 걸리거나 타임아웃이 걸리면 멈춤
  //락을 다시 확보
}

//작업실행
//락 해제



조건 큐 - 문제 해결사
조건 큐는 여러 스레드를 한 덩어리로 묶어 특정 조건이 만족할 때까지 한꺼번에 대기할 수 있는 방법을 제공하기 때문에 '조건 큐'라는 이름으로 불린다. 데이터 값으로 일반적인 객체를 담아두는 보통의 큐와 달리 조건 큐에는 특정 조건이 만족할 때까지 대기해야하는 스레드가 값으로 들어간다.

모든객체르르 스스로를 조건 큐로 사용할 수 있으며, 모든 객체가 갖고 있는 wait, notify, notifyAll 메소드는 조건 큐의 암묵적인 API라고 봐도 좋다. 자바 객체의 암묵적인 락과 암묵적인 조건 큐는 서로 관련돼 있는 부분이 있는데 ,이를테면 X라는 갟체의 조건 큐 API를 호출하고자 하면 반드시 객체 X의 암묵적인 락을 확보하고 있어야함나한다.

Object.wait메소드는 현재 확보하고 있는 락을 자동으로 해제하면서 운영체제에게 현재 스레드를 멈춰달라고 요청하고, 따라서 다른 스레드가 락을 확보해 객체 내부의 상태를 변경할 수 있도록 해준다. 대기 상태에서 깨어나는 순간에는 해제했던 락을 다시 확보한다. 풀어서 말하면 Object.wait메소드는 나는 대기상태에 ㄷ르어갈 예정인데, 만약 뭔가 재미잇는 일이 생기면 깨워주기 바랍니다"라는 뜻. notify와 notifyAll은 "뭔가 재미잇는 일이 발생했습니다"와 같다.

















 

'JAVA이야기' 카테고리의 다른 글

어노테이션2  (0) 2011.11.21
어노테이션  (0) 2011.11.21
스레드 팩토리  (0) 2011.11.11
Selector.open() 뜯어보자  (0) 2011.11.10
Selector & Channel  (0) 2011.11.09
:
Posted by НooпeУ


Code Start Code End