2011. 9. 26. 13:45
ReentrantLock JAVA이야기2011. 9. 26. 13:45
- 배타적인 확보 연산만 제공하므로, tryAcquire, tryRelease, isHeldExclusively와 같은 메소드만 제공하고 있다.
- 공정하지 않은 형태로 동작하는 tryAcquire메소드의 코드
- ReentrantLock에서는 동기화 상태 값을 확보되 ㄴ락의 개수를 확인하는데 사용하고, owner라는 변수를 통해 락을 가져간 스레드가 어느 스레드인지도 관리한다.
- onwer변수에는 현재 스레드에서 락을 확보할 때 현재 스레드를 추가하고 , 해제되는 시점에 onwer에서 현재 스레드를 제거하도록 돼 있다. (owner : 점유하고 있는 스레드를 가리킴)
- tryRelease 메소드에서는 unlock 메소드를 호출하기 전에 owner 변수에 들어 있는 내용을 들여다 보고 해당 락을 확보하고 있는 스레드가 현재 스레드인지를 확인한다.
- tryAcquire 메소드에서는 락을 확보하려는 시도가 재진입시도인지 아니면 최초로 락을 확보하려는 것인지 구분하기 위한 용도로 owner변수의 내용을 사용한다.
- 스레드에서 락을 확보하려고 할 때의 상황
1. tryAcquire메소드는 먼저 락의 상태를 확인한다.
2. 락이 풀려 있는 상태라면 락을 확보했다는 사실을 알릴 수 있도록 상태 값을 업데이트해본다.
3. 락의 상태를 확인하고 값을 업데이트 하는 동안 다르스레드가 락의 상태를 변경할 가능성이 있으므로 tryAcquire메소드는 compareAndSetState메소드를 사용해 상태 값을 단일 연산으로 업데이트, 이런방법을 사용하면 락 확보여부를 확인하고 값을 업데이트하는 사이에 다른 스레드에서 값을 사용하는 경우를 방지할 수 있다.
4. 락 상태를 확인했는데 이미 확보된 상태라고 하면, 락을 확보하고 있는 스레드가 현재 스레드인지를 확인하고 만약 그렇다면 락 확보 개수를 증가시킨다.
5. 만약 락을 확보하고 있는 스레드가 현재 스레드가 아니라면 확보 시도가 실패한 것으로 처리한다.
- 공정하지 않은 형태로 동작하는 tryAcquire메소드의 코드
- ReentrantLock에서는 동기화 상태 값을 확보되 ㄴ락의 개수를 확인하는데 사용하고, owner라는 변수를 통해 락을 가져간 스레드가 어느 스레드인지도 관리한다.
- onwer변수에는 현재 스레드에서 락을 확보할 때 현재 스레드를 추가하고 , 해제되는 시점에 onwer에서 현재 스레드를 제거하도록 돼 있다. (owner : 점유하고 있는 스레드를 가리킴)
- tryRelease 메소드에서는 unlock 메소드를 호출하기 전에 owner 변수에 들어 있는 내용을 들여다 보고 해당 락을 확보하고 있는 스레드가 현재 스레드인지를 확인한다.
- tryAcquire 메소드에서는 락을 확보하려는 시도가 재진입시도인지 아니면 최초로 락을 확보하려는 것인지 구분하기 위한 용도로 owner변수의 내용을 사용한다.
- 스레드에서 락을 확보하려고 할 때의 상황
1. tryAcquire메소드는 먼저 락의 상태를 확인한다.
2. 락이 풀려 있는 상태라면 락을 확보했다는 사실을 알릴 수 있도록 상태 값을 업데이트해본다.
3. 락의 상태를 확인하고 값을 업데이트 하는 동안 다르스레드가 락의 상태를 변경할 가능성이 있으므로 tryAcquire메소드는 compareAndSetState메소드를 사용해 상태 값을 단일 연산으로 업데이트, 이런방법을 사용하면 락 확보여부를 확인하고 값을 업데이트하는 사이에 다른 스레드에서 값을 사용하는 경우를 방지할 수 있다.
4. 락 상태를 확인했는데 이미 확보된 상태라고 하면, 락을 확보하고 있는 스레드가 현재 스레드인지를 확인하고 만약 그렇다면 락 확보 개수를 증가시킨다.
5. 만약 락을 확보하고 있는 스레드가 현재 스레드가 아니라면 확보 시도가 실패한 것으로 처리한다.
'JAVA이야기' 카테고리의 다른 글
AbstractQueuedSynchronizer (0) | 2011.09.26 |
---|---|
Semaphore와 CountDownLatch (0) | 2011.09.26 |
Future클래스와 ExecutorService (0) | 2011.09.24 |
집중 대응 정책 (0) | 2011.09.19 |
ThreadPoolExecutor (0) | 2011.09.19 |