나는 이것들 중 어느 것이 실제로 더 낫고 왜 그런지 궁금합니다.
Lock
그리고 Condition
(및 다른 새 concurrent
클래스)는 도구 상자를위한 더 많은 도구 라는 것을 알았습니다 . 나는 오래된 도리 ( synchronized
키워드)로 필요한 모든 것을 할 수 있었지만 어떤 상황에서는 사용하기가 어색했습니다. 도구 상자에 고무 망치, 볼펜 해머, 프라이 바 및 네일 펀치와 같은 도구를 더 추가하면 이러한 어색한 상황이 훨씬 간단 해졌습니다. 그러나 오래된 클로 해머는 여전히 그 사용 점유율을 봅니다.
나는 하나가 다른 것보다 실제로 "더 낫다"고 생각하지는 않지만, 각각은 다른 문제에 더 잘 맞습니다. 간단히 말해서, 간단한 모델과 범위 지향적 특성은 synchronized
코드의 버그로부터 나를 보호 하는 데 도움이되지만 더 복잡한 시나리오에서는 동일한 이점이 방해가되는 경우가 있습니다. 해결을 돕기 위해 동시 패키지가 생성 된보다 복잡한 시나리오입니다. 그러나이 상위 구조를 사용하려면 코드에서보다 명확하고 신중한 관리가 필요합니다.
===
나는 생각 의 JavaDoc가 사이의 차이를 잘 설명하지 Lock
하고 synchronized
(강조는 내입니다) :
잠금 구현은 동기화 된 메소드 및 명령문을 사용하여 얻을 수있는 것보다 더 광범위한 잠금 조작을 제공 합니다. 그것들은 보다 유연한 구조화를 허용 하고 , 상당히 다른 속성을 가질 수 있으며, 연관된 여러 개의 Condition 객체를 지원할 수 있습니다 .
...
의 사용 동기화 방법 이나 문은 모든 객체와 관련된 암묵의 감시 락에의 액세스를 제공하지만, 힘 모든 잠금 획득 및 해제는 블록 구조 방식으로 발생하는 다음과 같은 경우 여러 잠금이 되어 인수 가 반대 순서로 발표해야 하고, 모든 잠금은 잠금을 획득 한 것과 동일한 어휘 범위에서 해제해야합니다 .
동기화 된 메소드 및 명령문 의 범위 지정 메커니즘을 사용하면 모니터 잠금을 사용하여 프로그래밍하는 것이 훨씬 쉬워지고 잠금 과 관련된 많은 일반적인 프로그래밍 오류를 피할 수 있지만보다 유연한 방식으로 잠금으로 작업해야하는 경우가 있습니다. 예를 들어, * 동시에 액세스되는 데이터 구조를 순회하기위한 * 일부 알고리즘 * 은 "Hand-over-hand"또는 "chain locking"을 사용해야합니다. 노드 A, 노드 B의 잠금을 획득 한 다음 A를 해제하고 C를 획득합니다. 그런 다음 B를 놓고 D 등을 얻습니다. 의 구현 잠금 인터페이스는 이런 종류의 테크닉을 이용할 수있게 다른 스코프 내에서 락을 취득 및 해제 할 수 있도록 하고,여러 개의 잠금 장치를 임의의 순서로 획득 및 해제 할 수 있습니다 .
이러한 유연성 증가로 인해 추가 책임이 따릅니다 . 블록 구조 잠금 이 없으면 동기화 된 메소드 및 명령문에서 발생 하는 자동 잠금 해제가 제거됩니다 . 대부분의 경우 다음 관용구를 사용해야합니다.
...
때 잠금 및 잠금 해제가 다른 범위에서 발생 ,주의가주의해야 보장 이 유지되는 잠금이 동시에 실행되는 모든 코드 마지막으로-시도에 의해 보호 또는 시도 - 캐치되어 하는 잠금이 해제되어 있는지 확인합니다 필요한 경우.
잠금 구현은 제공하는 추가 기능 제공하여 동기화 방법 및 문장의 사용에를 취득하는 비 차단 시도 잠금을 (설정된 tryLock ()), 시도 중단 될 수있는 잠금 획득 lockInterruptibly을 (() 및 시도 획득 제한 시간을 초과 할 수있는 잠금 (tryLock (long, TimeUnit))
...