2012-02-19 4 views
6

스레드로부터 안전해야하는 공유 된 맵 데이터 구조가 있습니다. 지도를 읽고 추가하는 가장 효율적인 방법이 동기화 되었습니까?데이터 구조를 스레드로부터 안전하게 만드는 가장 효율적인 방법 (Java)

감사합니다.

편집 : 데이터 구조가 업데이트 할 수없는 캐시입니다. 즉, 채워지면 캐시를 업데이트하지 않습니다. 그래서 많은 양의 글을 처음에 읽었을 때 주로 읽습니다.

답변

6

"가장 효율적"이라는 것은 상대적이며 물론 특정 상황에 따라 다릅니다. 그러나지도와 동시에 작업하는 많은 스레드가있을 것으로 예상되는 경우 ConcurrentHashMap과 같은 것을 고려하십시오. 스레드 안전하지만 동시 액세스를 허용합니다 (Hashtable 또는 Collections.synchronizedMap()과는 달리).

0

동기화 된 메서드 또는 컬렉션이 제대로 작동합니다. 가장 효율적인 접근 방식은 아니지만 구현이 간단하며 초당 수백만 번 구조에 액세스하지 않는 한 오버 헤드를 인식하지 못합니다.

ConcurrentHashMap을 사용하는 것이 더 좋은 생각입니다. 처음부터 동시성을 고려하여 설계되었으므로 매우 동시적인 상황에서 더 잘 수행되어야합니다.

3

이것은 앱에서 사용하는 방법에 따라 다릅니다. 쓰기는 일반적인되지 않을 것이 주로 읽는 않다면

당신이 읽는 많은 일을하고 그것을 기록하는 경우 ConcurrentHashMap는, 아마도하는 ReadWriteLock 를 사용하여 콜렉션 내부에 랩 일반적인지도 최선의 선택을 위해 (때문에 당신을 쓰기 만 할 때 빠른 액세스와 잠금을 얻습니다).

Collections.synchronizedMap()은 모든 메소드를 동기화 한 래퍼를 제공하기 때문에 최악의 경우 일 수 있습니다.

1

특정 용도 (업데이트 할 수없는 캐시)의 경우 쓰기 맵의 복사본이 동기화 된 맵과 ConcurrentHashMap보다 성능이 우수합니다.

참조 : 예 : https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap (예 : 아파치는 쓰기 맵 구현에 사본이 있습니다).

+0

링크가 https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Maps로 변경된 것으로 보입니다. –

관련 문제