2017-04-11 7 views
0

75 개 이상의 요청이 있으며 각 요청은지도를 업데이트하거나 액세스하려고합니다. 그리고 MAP을 업데이트하는 동안 코드 블록 동기화를 사용합니다. 그러면 성능 문제가 발생할 수 있습니다.이 시나리오에서 동기화를 어떻게 피할 수 있습니까?

MAP, 75+ 요청을 동시에 업데이트하려면 다른 방법을 제안하십시오.

참고 : 위의 아이디어를 Java로 구현하려고합니다.

+0

스레드 안전지도를 원할 경우 동시에 여러 번 액세스 할 수 없으므로 성능 문제가 발생합니다. – BackSlash

답변

1

그것을 해결하기 위해 여러 가지 방법이 있습니다, 무엇을 가장 잘 맞는 참조 성능 과부하를 확인하십시오. ConcurrentHashMap의 경우, ConcurrentHashMap의 특정 섹션에서 잠금이 확보됩니다. 즉, 두 개의 스레드가 두 개의 다른 섹션에 개별적으로 액세스하려고 시도하는 경우 대기없이 수행 할 수 있습니다.

1

concurrent hash map을 사용해보세요. 기본적으로 해시 맵을 더 작은 범위로 나누고 전체 맵에 잠금을 설정하는 대신 작은 범위에서만 잠금을 설정합니다.

hashmap을 사용하여 synchronized 블록을 사용하는 경우 완전한 해시 맵에 잠금을 설정하고 2 회 쓰기 작업을 동시에 수행 할 수 없습니다. 그러나 동시 해시 맵을 사용하고 서로 다른 범위에서 2 개의 쓰기 작업을 작성하는 경우 두 작업을 동시에 수행 할 수 있습니다.

더 나은 이해를 위해 사용하기 전에 how concurrent hash map works을 참조하십시오.

편집 : hashmap 및 concurrenthashmap의 성능 향상을 단일 및 다중 스레드 응용 프로그램에서 확인하십시오. Performance ConcurrentHashmap vs HashMap.

SynchronizedMap ConcurrentHashMap의

당신이 증가 할 수있는 요청의 수 당신을 위해 더 좋을 것 ConcurrentHashMap을 사용하는 경우 당신은하지 않습니다 :

1

한 번에 75 개 정도의 요청으로 인해 Map에 액세스하는 다양한 방법간에 성능상의 차이가 발생할 가능성은 거의 없습니다. 가장 중요한 것은 코드의 단순성과 유지 보수성입니다. java.util.ConcurrentHashMap은 설명하는 규모로 성능 이점을 나타내지는 않지만 다른 솔루션보다 작업하기가 훨씬 쉽습니다.

0

ConcurrentHashMap의 기존 답변과 함께 몇 가지 추가 원근감을 추가하겠습니다. 많은 요청이 유형 읽기이고 요청이 거의 없다면 java.util.concurrent.locks.ReadWriteLock을 살펴볼 수 있습니다. 여러 스레드가 리소스를 읽을 수 있지만 한 번에 하나만 쓸 수 있습니다. 업데이트 요청이 여러 번있는 경우 이전 답변에서 제안한대로 ConcurrentHashMap을 사용할 수 있습니다.