2009-07-21 4 views
3

Lock (java.util.concurrent.locks.Lock)의 고유 잠금보다 많은 이점 중 하나는 잠금이 "체인 잠금"을 용이하게한다는 점입니다. 체인 잠금, A에 대한 자물쇠를 누른 다음 B 릴리스 A를 획득 한 후 B를 획득 한 후 C를 획득하십시오.잠금을 통한 체인 잠금

나는 호기심에 사로 잡혀 있는데 체인 잠금을 사용해야하는 상황이 발생했습니다 ?

건배, 빅

답변

3

당신이 상호 독립적 인 임계 영역의 시리즈를 가지고 있지만, 당신이 적절할 것 순서대로 실행하고자하는 모든 상황.

버리 토 바와 같이 생각해보십시오. 소비자의 대기열이 있고, 다른쪽에는 4 명 정도의 근로자가 있습니다. 어떤 소비자가 다른 사람들보다 앞서 건너 뛰는 것을 원하지 않으며, 한 번에 두 명 이상의 소비자에게 서비스를 제공하기를 원하지 않습니다. 각 서버간에 대기열을 만들 수 있지만 파이프 라인은 엄격하게 순차적이며 때때로 추상화가 코드에서 가장 좋은 표현이 아님을 알고 있습니다.

그러나 파이프 라인의 단계 중 하나를 획득 할 수있는 예외 처리 기능을 제공 할 수 있습니다. 예 : 마지막에 계산원입니다. 누군가가 선물 카드를 받으면 대기열을 건너 뛰고 계산원에게 곧바로 갈 수 있습니다. 이 모델은 평균 대기 시간/대기 시간을 줄이는 동시에 다른 작업자에게 필요한 잠금 및 시퀀싱 보장을 제공합니다.

컴퓨팅에서와 마찬가지로 동일한 효과를 얻는 방법은 많이 있지만 도메인 모델과 구현 모델 간의인지 적 거리는 코드의 명확성에 영향을줍니다. 따라서 시퀀스에서 다음 리소스를 얻기 전에 하나의 리소스를 해제하지 않도록하려는 응용 프로그램이있는 경우 잠금 체인이 편리한 솔루션입니다.

마지막으로, java의 동기화 된 기능이 엄격하게 중첩되어 있다는 것을 잊지 말고 획득 한 순서로만 잠금을 해제 할 수 있습니다. 길고 복잡한 파이프 라인이있는 경우 이상적이지 않습니다.

+0

IMO, 파이프 라인이 순차적이라면 큐/파이프를 통해 구현하는 것이 가장 좋습니다. 작업자 - 대기열 - 작업자 - 대기열 - 작업자 - 대기열 - 계산원. 대기열 점퍼가 들어 오면 그는 점프 대기열로 들어갑니다. 각 Worker는 입력 Queue에서 팝하고 출력 Queue로 푸시합니다. –

관련 문제