4

생성자 - 사용자 시나리오를 상상해보십시오. 스레드 A는 항목을 생성하며 다른 스레드에서 많은 스레드가이를 소비합니다.저렴 : 단일 ConcurrentHashMap의 n 반복자 또는 HashMap의 n 인스턴스를 사용하는 순회

이 경우 각 소비자 스레드에 많은 항목을 전달합니다.

는 저렴 (메모리에있는 차의 CPU utlization의 의미에서 차이)라면 나 자신을 요청하고이를 수행

  • 각 소비자가 HashMap의 별도의 인스턴스를 스레드 제공합니다. Map 한 소비자를 통과 한 후, Map의 새로운 인스턴스가 생성되고

또는

  • 이 하나의 ConcurrentHashMap를 사용하고 Iterator을 만들 수있는 다음 스레드에 다음 생성 된 항목을 전달하는 데 사용 각각의 소비자 스레드에 대해 그리고 Iterator을 스레드에 넘겨서 Map을 제거한 후에 - 각 Iterator는 자체의 Map 뷰를 포함합니다.

어떻게 생각하십니까? 더 많거나 적은 일반적인 대답이 가능합니까?
또는 항목 수, 스레드 등의 일부 변수에 크게 의존합니까?
편집 : 아니면 이런 종류의 문제를 더 잘 해결할 수있는 다른 종류의 데이터 구조를 사용해야합니까?

+1

+1 흥미로운 질문입니다. 'ConcurrentLinkedQueue'는 거의 이것을하지만,별로는 아닙니다. – finnw

답변

5

java 동시 패키지는이 시나리오에 맞는 데이터 구조를 제공합니다.

@see java.util.concurrent.BlockingDeque

그러나 일부 성능 테스트를 수행하십시오 : 당신이 케이스를 사용에 결과가 stongly 달려 있기 때문이다. 그리고 이것이 마이크로 최적화 인 경우보다 깨끗하고 이해하기 쉽고 스레드 저장 방법이 성능 저하없이 성능 최적화보다 훨씬 우수합니다.

+0

내가 할 수 있으면 업데이트에 대한 또 다른 표를 줄 것입니다. 나는 아직이 수준의 최적화가 확실한 차이를 만들어 낼 자바 애플리케이션을 보지 못했다. – biziclop

+0

java.util.concurrent.ArrayBlockingQueue도 작업을 수행합니까? 그렇지 않다면, 왜? – MRalwasser

+0

@Malwasser : ArrayBlockingQueue는 이러한 유형의 작업을 위해 설계되었습니다. – Ralph

0

CPU 비싼 것은 스레드 경합입니다. 첫 번째 접근 방식은 논쟁을 전혀 일으키지 않을 것입니다 - 각 스레드는 Map의 로컬 버전을 갖게 될 것입니다 - 높은 메모리 소비를 희생 시키십시오.
필자는 여러 설정 (스레드 수, 맵 크기 등)에 대한 두 가지 시나리오를 벤치마킹했습니다. 벤치 마크가없는 정확한 수치를 말하는 것은 어렵습니다.

관련 문제