2013-05-27 4 views
5

synchronized + wait() 메서드와 notify() 키워드가 완전히 동일합니까? (java.util.concurrent.locks.Lock)를 사용하고 있습니까?명시 적 잠금과 암시 적 잠금 비교

암시 적 잠금 (synchronized) 대신 잠금 (명시 적 잠금)을 사용하여 스레드를 안전하게 프로그래밍 할 수 있습니까?

저는 항상 암시 적 잠금을 사용하고 있습니다. 나는 Lock 메쏘드와 같은 인터페이스 구현에 의해 주어진 이점을 알고있다 : isLocked(), getLockQueueLength(), getHoldCount(), 등등 ... 그러나 여전히 오래된 학교 방식 (wait()notify())은 그러한 방법을 가지고 있지 않은 것 외에 다른 한계를 가지고 있을까?

저는 기아가 없도록 허용하는 (부울 공평성) 매개 변수로 잠금을 구성 할 가능성을 알고 있습니다.

+1

글쎄, 100 % 동일 할 때와 완전히 똑같지는 않다. 그렇다면 하나의 존재는 중복 될 것이다 ;-) –

+1

@Joachim Sauer 분명히 프로그래밍 언어가 두 개의 동일한 같은 일을하는 방법. – Patashu

+1

@Patashu : 분명히 아닙니다. 그러나 적어도 몇 가지 장점이 없다면 (예를 들어'isLocked()'메서드와 같은) 두 번째 옵션을 처음 추가 한 후에 오랫동안 두 번째 옵션을 추가 할 가능성은 희박합니다. –

답변

7

예, 절대적으로 java.util.concurrent.locks.Lock을 사용하여 스레드로부터 안전한 프로그램을 작성할 수 있습니다. java.util.concurrent.locks.Lock과 같은 구현이 보이면 ReentrantLock 내부 구현은 이전 synchronized 블록을 사용합니다.

잠금 구현은 동기화 된 메서드 및 문을 사용하여 얻을 수있는 것보다 더 광범위한 잠금 작업을 제공합니다. 그것들은,보다 유연한 구조화를 가능하게 해, 상당히 다른 속성을 가질 수가있어 관련의 복수의 Condition 객체를 지원할 가능성이 있습니다.

내 차이점을 추가하면 synchronized 키워드는 자연스럽게 언어 지원 기능을 내장하고 있습니다. 이는 JIT가 을 Locks과 같이 최적화 할 수 없음을 의미 할 수 있습니다. 예 : 그것은 synchronized blocks을 결합 할 수 있습니다. 동기화은 잠금에 액세스하는 소수의 스레드에 가장 적합하고 Lock은 동일한 잠금에 액세스하는 많은 스레드에 가장 적합 할 수 있습니다. 또한 synchronized 블록을 쓰면 은 입력 대기중인 스레드가 액세스 권한을 부여받는 순서에 대해이 보장되지 않습니다.

2

블록과 synchronized 블록은 동일한 의미를 가지며 Java 메모리 모델 관점에서 동일한 보증을 제공합니다. 가장 큰 차이점은 Locks가보다 유연하고 세분화 된 잠금 관리를 허용하는 더 많은 제어 (예 : tryLock 또는 잠금을 공정한 것으로 요청할 때 등)를 제공한다는 것입니다.

그러나 이러한 추가 기능이 필요하지 않은 경우 평범한 이전 synchronized 블록을 사용하면 오류 공간이 줄어들어 (예 : unlock으로 "잊어 버릴 수 없음") 블록을 사용하는 것이 좋습니다.

관련 문제