최종 속성에 대한 동기화 된 블록을 읽을 때마다 또는 최종 속성 중 하나를 수정 하시겠습니까? 또는 ConcurrentMap과 같은 동시 클래스 인 을 사용 하시겠습니까?
동기화는 고유 잠금 또는 잠금 장치를 모니터로 알려진 내부 개체 주위에 내장되어 있습니다. 모든 객체에는 고유 한 잠금이 있습니다. 관습 적으로, 객체의 필드에 대해 배타적이고 일관된 액세스가 필요한 스레드는 객체의 고유 한 잠금을 액세스하기 전에 가져와야하며, 잠금이 끝나면 내장 잠금을 해제해야합니다.
ConcurrentMap
즉의 구현 ConcurrentHashMap
은 재진입 잠금 상호 배타적 로크 인에게 사용은 잠금 unlock()
메소드를 호출 할 때까지 lock()
방법에 의해 취득 스레드에 의해 유지된다.비록, ReentrantLock
이 synchronized keyword
에 인수 암시 잠금으로 보장 동일한 가시성과 순서 부를 제공, 그것은 더 많은 기능을 제공하고 특정 측면에서 다릅니다 긴 대기에 잠금 장치를 제공하는 fairness property
를 지정하여
ReentrantLock
공정 할 수 스레드, 경합의 경우. - 은 다른 스레드가 사용 가능하거나 보유하지 않은 경우에만 잠금을 획득하는 편리한 방법을 제공하여 잠금 대기중인 스레드의 차단을 줄입니다. 특정 시간 동안 잠금을 사용할 수없는 경우 시간 초과가있는
tryLock()
을 사용하여 시간 초과 할 수 있습니다. synchronized keyword
의 경우 스레드는 제한된 시간 동안 잠금 대기를 차단할 수 있으며이를 제어 할 방법이 없습니다. ReentrantLock
은 잠금을 기다리는 동안 스레드를 인터럽트하는 데 사용할 수있는 lockInterruptibly()
이라는 메서드를 제공합니다. boolean replace(K key, int hash, V oldValue, V newValue) {
// called by replace(K key, V oldValue, V newValue)
lock(); // acquire the lock
try {
HashEntry<K,V> e = getFirst(hash);
while (e != null && (e.hash != hash || !key.equals(e.key)))
e = e.next;
boolean replaced = false;
if (e != null && oldValue.equals(e.value)) {
replaced = true;
e.value = newValue;
}
return replaced;
} finally {
unlock(); // unlock
}
}
은 재진입 동기화를 사용 등 put()
, writeObject(java.io.ObjectOutputStream)
같이 또한 구현되는 다른 기능이있다 :
사용 reentrant lock
의 예 ConcurrentHashMap
의 내측 replace(K key, V oldValue, V newValue)
기능 implementaion에서 도시 될 수있다ReentrantLock
을 사용하면 동기화 코드가 스레드를 차단하지 못하도록 많은 추가 예방 조치를 취해야합니다. 그래서 나는 귀하의 케이스에 대해 ConcurentMap
이 바람직하다고 생각합니다.
참조 :
- Intrinsic Locks and Synchronization
- ReentrantLock Class
- Difference between synchronized vs ReentrantLock
- ConcurrentHashMap
개체가 불변 일 경우 더 쉬울 것입니다 ... – assylias
이것은 풀을위한 개체이므로 다시 사용할 수 있습니다. 이 경우 불변 개체에 의존하기가 어렵습니다. – FBB