2014-02-07 6 views
2

의 javadoc는 말한다 :ConcurrentHashMap의 및 스레드 안전

해시 테이블이 업데이트 취득에서는 전체 동시성 및 조정 예상 동시성을 지원. 이 클래스는 Hashtable과 동일한 기능을 수행하는 을 따르며 Hashtable의 각 메소드에 해당하는 메소드 의 버전을 포함합니다. 그러나 모든 작업은 스레드로부터 안전하지만 검색 작업에는 잠금이 필요하지 않으며 모든 테이블을 에 잠그면 모든 액세스가 차단됩니다. 이 클래스는 스레드 안전성에 의존하지만 동기화 세부 정보가 아닌 프로그램에서 Hashtable과 완전히 상호 운용됩니다.

위의 문단에서 다음 문장의 의미는 무엇입니까?

이 클래스는 스레드 안전에 을 의존하는 프로그램에 해시 테이블과 완벽하게 상호 운용이 가능하지만 동기화 세부 사항에

답변

0

는 해시 테이블의의 javadoc이 발견되지 : 현재로

Java 2 플랫폼 v1.2에서이 클래스는 으로 개조되어 Map 인터페이스를 구현하여 Java Collections 프레임 워크의 구성원으로 만듭니다. 새 컬렉션 구현과 달리 Hashtable이 동기화됩니다. 스레드 안전 구현에 이 필요하지 않으면 HashTable 대신 HashMap을 사용하는 것이 좋습니다. 스레드 안전성이 높은 동시 구현이 필요한 경우 Hashtable 대신 ConcurrentHashMap을 사용하는 것이 좋습니다 ( ).

나는 Hashtable이 메소드를 동기화했지만 새로운 ConcurrentHashMap은 스레드 안전성을 보장하기 위해 동기화를 사용하지 않는다고 말합니다. "상호 운용성"에 관해서는 인터페이스가 기본적으로 동일하다는 것을 의미한다고 생각합니다. 따라서 둘 중 하나를 사용할 수 있습니다.

1

Hashtable 방법은 synchronized, 그리고 당신은 해시 테이블의 상태가 중간에 변경되지 않습니다 확인되는 코드의 블록을 작성할 수 있습니다

syncronized (hashtable) { 
    if (!hashtable.contains(key)) 
     hashtable.put(key, value); 
} 

ConcurrentHashMap의 방법은 아직도 synchronized (하지만 스레드 -됩니다 안전, javadoc에 지정된대로), 그것의 상태와 동시에 복합 연산을 수행 할 수 없습니다.

알림 : 위의 예시의 복합 연산은 ConcurrentHashMap api : putIfAbsent(K, V)에서 완벽하게 동일하지만 일부 유용한 동작은 없습니다.

+0

은'당신이 복합 연산을 그것의 상태와 동시 적으로 수행 할 수 없다 '는 것은 위의 코드를'synchronized (concurrenthashmap_obj)'와 함께 사용할 수 없다는 것을 의미합니까? –

+0

@aLearner 예. 구문 적으로 원인은 있지만 스레드 안전성에는 아무런 의미가 없습니다. – leventov