스레드로부터 안전해야하는 공유 된 맵 데이터 구조가 있습니다. 지도를 읽고 추가하는 가장 효율적인 방법이 동기화 되었습니까?데이터 구조를 스레드로부터 안전하게 만드는 가장 효율적인 방법 (Java)
감사합니다.
편집 : 데이터 구조가 업데이트 할 수없는 캐시입니다. 즉, 채워지면 캐시를 업데이트하지 않습니다. 그래서 많은 양의 글을 처음에 읽었을 때 주로 읽습니다.
스레드로부터 안전해야하는 공유 된 맵 데이터 구조가 있습니다. 지도를 읽고 추가하는 가장 효율적인 방법이 동기화 되었습니까?데이터 구조를 스레드로부터 안전하게 만드는 가장 효율적인 방법 (Java)
감사합니다.
편집 : 데이터 구조가 업데이트 할 수없는 캐시입니다. 즉, 채워지면 캐시를 업데이트하지 않습니다. 그래서 많은 양의 글을 처음에 읽었을 때 주로 읽습니다.
"가장 효율적"이라는 것은 상대적이며 물론 특정 상황에 따라 다릅니다. 그러나지도와 동시에 작업하는 많은 스레드가있을 것으로 예상되는 경우 ConcurrentHashMap과 같은 것을 고려하십시오. 스레드 안전하지만 동시 액세스를 허용합니다 (Hashtable
또는 Collections.synchronizedMap()
과는 달리).
동기화 된 메서드 또는 컬렉션이 제대로 작동합니다. 가장 효율적인 접근 방식은 아니지만 구현이 간단하며 초당 수백만 번 구조에 액세스하지 않는 한 오버 헤드를 인식하지 못합니다.
ConcurrentHashMap을 사용하는 것이 더 좋은 생각입니다. 처음부터 동시성을 고려하여 설계되었으므로 매우 동시적인 상황에서 더 잘 수행되어야합니다.
이것은 앱에서 사용하는 방법에 따라 다릅니다. 쓰기는 일반적인되지 않을 것이 주로 읽는 않다면
당신이 읽는 많은 일을하고 그것을 기록하는 경우 ConcurrentHashMap는, 아마도하는 ReadWriteLock 를 사용하여 콜렉션 내부에 랩 일반적인지도 최선의 선택을 위해 (때문에 당신을 쓰기 만 할 때 빠른 액세스와 잠금을 얻습니다).
Collections.synchronizedMap()은 모든 메소드를 동기화 한 래퍼를 제공하기 때문에 최악의 경우 일 수 있습니다.
특정 용도 (업데이트 할 수없는 캐시)의 경우 쓰기 맵의 복사본이 동기화 된 맵과 ConcurrentHashMap보다 성능이 우수합니다.
참조 : 예 : https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap (예 : 아파치는 쓰기 맵 구현에 사본이 있습니다).
링크가 https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Maps로 변경된 것으로 보입니다. –