2011. 9. 26. 14:21
AbstractQueuedSynchronizer JAVA이야기2011. 9. 26. 14:21
- AQS기반의 동기화 클래스가 담당하는 작업 가운데 가장 기본이 되는 연산은 바로 확보와 해제
- 확보 연산은 상태 기반으로 동작하며 항상 대기 상태에 들어갈 가능성이 있다.
- 락이나 세미포어 등의 입장에서는 확보라는 연산은 락이나 퍼밋을 확보한다는 것으로 그 의미가 굉장히 명확하다.
- 이 연산을 사용하는 호출자는 항상 원하는 상태에 다다를 때까지 대기할 수 있다는 가능성을 염두에 둬야 한다.
- CountDownLatch클래스를 놓고 보면 확보라는 연산은 "래치가 완료 상태에 다다를 때까지 대기하라"는 의미
- FutureTask 클래스에서는 확보가 "작업이 끝날 때까지 대기하라"
- 확보는 즉 "어떤 작업을 완료할 때까지 대기한다"라는 의미가 되겠다.
- 해제 연산은 대기 상태에 들어가지 않으며, 대신 확보 연산에서 대기중인 스레드를 풀어주는 역할을 한다.
- 특정 클래스가 상태 기반으로 동작혀면 반드시 상태 변수를 하나 이상 가지고 있어야 한다.
- AQS는 동기화 클래스의 상태 변수를 관리하는 작업도 어느 정도 담당하는데 getState, setState, compareAndSetState 등의 메소드를 통해 단일 int변수 기반의 상태 정보를 관리해준다.
boolean acquire() throws InterruptedException{
while(확보 연산을 처리할 수 없는 상태다){
- 확보 연산은 상태 기반으로 동작하며 항상 대기 상태에 들어갈 가능성이 있다.
- 락이나 세미포어 등의 입장에서는 확보라는 연산은 락이나 퍼밋을 확보한다는 것으로 그 의미가 굉장히 명확하다.
- 이 연산을 사용하는 호출자는 항상 원하는 상태에 다다를 때까지 대기할 수 있다는 가능성을 염두에 둬야 한다.
- CountDownLatch클래스를 놓고 보면 확보라는 연산은 "래치가 완료 상태에 다다를 때까지 대기하라"는 의미
- FutureTask 클래스에서는 확보가 "작업이 끝날 때까지 대기하라"
- 확보는 즉 "어떤 작업을 완료할 때까지 대기한다"라는 의미가 되겠다.
- 해제 연산은 대기 상태에 들어가지 않으며, 대신 확보 연산에서 대기중인 스레드를 풀어주는 역할을 한다.
- 특정 클래스가 상태 기반으로 동작혀면 반드시 상태 변수를 하나 이상 가지고 있어야 한다.
- AQS는 동기화 클래스의 상태 변수를 관리하는 작업도 어느 정도 담당하는데 getState, setState, compareAndSetState 등의 메소드를 통해 단일 int변수 기반의 상태 정보를 관리해준다.
boolean acquire() throws InterruptedException{
while(확보 연산을 처리할 수 없는 상태다){
if(확보 연산을 처리할 때까지 대기하길 원한다)
{
{
현재 스레드가 큐에 들어 있지 않다면 스레드를 큐에 넣는다.
대기 상태에 들어간다.
대기 상태에 들어간다.
}
else
else
return 실패
}
상황에 따라 동기화 상태 업데이트
스레드가 큐에 들어 있었다면 큐에서 제거한다.
return 성공
}
스레드가 큐에 들어 있었다면 큐에서 제거한다.
return 성공
}
void release(){
동기화 상태 업데이트
if(업데이트된 ㅅ아태에서 대기중인 스레드를 풀어줄 수 있다)
if(업데이트된 ㅅ아태에서 대기중인 스레드를 풀어줄 수 있다)
큐에 쌓여 있는 하나 이상의 스레드를 풀어준다.
'JAVA이야기' 카테고리의 다른 글
넌블로킹 알고리즘 (0) | 2011.09.27 |
---|---|
단일 연산 변수 클래스 (0) | 2011.09.27 |
Semaphore와 CountDownLatch (0) | 2011.09.26 |
ReentrantLock (0) | 2011.09.26 |
Future클래스와 ExecutorService (0) | 2011.09.24 |