ConcurrentHashMap 대 동기화된 해시맵
포장지 클래스를 사용하는 것과 무엇이 다른가?SynchronizedMap
에서HashMap
그리고ConcurrentHashMap
?
단지 이 모든 것을 수정할 수 있는 것인가?HashMap
한편)ConcurrentHashMap
)?
동기화된HashMap
:
각 방법은 a를 사용하여 동기화된다. 그래서 synchMap의 get과 put 메서드는 잠금을 획득한다.
전체 컬렉션을 잠그는 것은 성능 오버헤드다.하나의 나사산이 자물쇠를 붙잡고 있는 동안, 다른 나사산은 그 컬렉션을 사용할 수 없다.
ConcurrentHashMap
JDK 5에 소개되었다.
물체 레벨에는 잠금이 없다.자물쇠가 훨씬 세밀하다.A을 위해
ConcurrentHashMap
자물쇠는 에 있을 수 있다.낮은 레벨의 잠금 효과는 동기화된 컬렉션에서는 불가능한 동시 판독기와 작성기를 가질 수 있다는 것이다.이는 훨씬 더 큰 확장성으로 이어진다.
ConcurrentHashMap
조금도 개의치 않다ConcurrentModificationException
다른 스레드가 반복하는 동안 한 스레드가 수정하려고 하는 경우
이 기사 Java 7: 해시맵 대 ConcurrentHashMap은 매우 잘 읽힌다.적극 추천한다.
단답:
두 지도는 모두 두 지지도 스스 스스 스: ::의 세이프 구축이다. ) 이다.Map
접점 ConcurrentHashMap
높은 동시성이 예상되는 경우에 더 높은 처리량을 위해 구현된다.
브라이언 괴츠의 이면에 관한 기사ConcurrentHashMap
아주 잘 읽힌다.적극 추천한다.
ConcurrentHashMap
전체 지도를 동기화하지 않고도 안전하게 스레드를 사용할 수 있다.읽기는 쓰기가 자물쇠로 끝나는 동안 매우 빠르게 일어날 수 있다.
ConcurrentHashMap과 SynchronizedHashmap을 모두 사용함으로써 스레드 안전을 달성할 수 있다.하지만 그들의 건축물을 보면 많은 차이가 있다.
- 동기화된 해시맵
물체 레벨에서 잠금을 유지한다.그래서 당신이 put/get과 같은 작업을 수행하려면 먼저 자물쇠를 획득해야 한다.동시에 다른 스레드는 어떠한 조작도 할 수 없다.그래서 한 번에 하나의 실만 이 일을 할 수 있다.그래서 여기서 대기시간이 늘어날 것이다.ConcurrentHashMap과 비교할 때 성능이 상대적으로 낮다고 할 수 있다.
- ConcurrentHashMap
세그먼트 레벨에서 잠금을 유지한다.16개 세그먼트를 보유하고 있으며, 기본적으로 동시성 수준을 16개로 유지한다.따라서 한 번에 16개의 스레드가 ConcurrentHashMap에서 작동할 수 있다.게다가 읽기 작업에는 자물쇠가 필요하지 않다.그래서 많은 수의 스레드가 그 위에서 Get 작업을 수행할 수 있다.
srad1이 세그먼트 2에서 put operation을 수행하고 srad2가 세그먼트 4에서 put operation을 수행하고자 하는 경우 여기서 허용된다.16개의 스레드가 한 번에 ConcurrentHashMap에서 업데이트(put/delete) 작업을 수행할 수 있음을 의미한다.
여기서 기다리는 시간이 줄어들도록.따라서 성능은 동기화된 Hashmap보다 상대적으로 우수하다.
둘 다 해시맵의 동기화된 버전이며, 핵심 기능과 내부 구조가 다르다.
ConcurrentHashMap은 개념적으로 독립 해시맵으로 볼 수 있는 내부 세그먼트로 구성된다.그러한 모든 세그먼트는 높은 동시 실행 시 별도의 스레드에 의해 잠글 수 있다.따라서 여러 스레드가 서로 차단/대기하지 않고 ConcurrentHashMap에서 키 값 쌍을 가져오거나 넣을 수 있다.이것은 더 높은 처리량을 위해 구현된다.
반면에
소장품.synchronedMap(), 우리는 해시맵의 동기화된 버전을 얻으며, 그것은 차단 방식으로 액세스된다.즉, 여러 스레드가 동시에 syncedMap에 액세스하려고 하면 동기화된 방식으로 한 번에 하나씩 키 값 쌍을 가져오거나 넣을 수 있게 된다.
SynchronizedMap
그리고ConcurrentHashMap
둘 다 나사산 안전 등급이며 다중 스레드 애플리케이션에서 사용될 수 있으며, 이들 사이의 주요 차이점은 나사산 안전을 달성하는 방법에 관한 것이다.
SynchronizedMap
전체 Map 인스턴스에 대한 잠금을 획득하는 동안ConcurrentHashMap
지도 인스턴스를 여러 세그먼트로 나누고 해당 세그먼트에 대해 잠금을 수행한다.
ConcurrentHashMap
로 알려진 미세한 잠금 메커니즘을 사용한다.lock stripping
더 높은 수준의 공유 액세스를 허용한다.이것 때문에 그것은 더 나은 동시성과 확장성을 제공한다.
또한 반복자는 을 위해 돌아왔다.ConcurrentHashMap
Synced HashMap에서 사용하는 fail fast 기법 대신 약하게 일관성이 있다.
메드에 SynchronizedMap
반면에 물체의 자물쇠를 잠그다.ConcurrentHashMap
내용물의 양동이에 자물쇠를 대신 걸어두는 '잠금 스트라이핑' 개념이 있다.따라서 확장성과 성능이 향상되었다.
ConcurrentHashMap :
1)두 지도 모두 지도 인터페이스의 스레드 세이프 구현이다.
2)ConcurrentHashMap을 구현하여 동시성이 높은 경우 처리량을 높인다.
3) 물체 레벨에 잠김이 없다.
동기화된 해시 맵:
1) 각 방법은 객체 레벨 잠금을 이용하여 동기화한다.
ConcurrentHashMap은 데이터에 대한 동시 액세스를 허용한다.전체 지도는 세그먼트로 나뉜다.
읽기 작업 즉. get(Object key)
세그먼트 수준에서도 동기화되지 않음.
그러나 작업을 기록하십시오. remove(Object key), get(Object key)
세그먼트 레벨에서 잠금을 획득한다.전체 맵의 일부만 잠겨 있지만, 잠긴 세그먼트를 제외한 다른 스레드는 여전히 다양한 세그먼트에서 값을 읽을 수 있다.
반면에 SyncedMap은 객체 레벨에서 잠금을 획득한다.모든 스레드는 작동에 관계 없이 현재 스레드를 기다려야 한다(읽기/쓰기).
ConcurrentHashMap 대 Synced HashMap 에 대한 간단한 성능 테스트.테스트 흐름이 호출되고 있음put
단번에get
에 대해 세 갈래로Map
동시에@trshiv가 말했듯이 ConcurrentHashMap은 잠금 없는 읽기 작업에 대한 처리량과 속도가 더 높다.그 결과 작업 시간이 경과한 경우10^7
, ConcurrentHashMap은2x
Synchronized HashMap보다 빠름.
동기화된 해시맵
- 잠금 메커니즘 - 전체 맵을 잠그므로 여러 스레드가 동시에 맵에 액세스할 수 없음그래서 실적은 상대적으로 적다.
2.Null 키 또는 값 - 키 또는 값으로 null을 허용한다.
3.동시 수정 예외 - 동기화된 맵에 의한 반복기 반환 동시 수정 예외 발생
ConcurrentHashMap
1.Lock mechanism -부분 잠금, Concurrent hashmap은 동시 읽기 및 쓰기를 허용한다.따라서 동기화된 지도보다 성능이 상대적으로 우수함
2.Null 키 또는 값 - 키 또는 값으로 null을 허용하지 않는다.만약 당신이 그것을 사용한다면, Java.lang을 던질 것이다.널포인터런타임의 예외.
3.동시 수정 예외 - 동시 수정 예외를 발생시키지 않는다.
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Ex_ConcurrentHashMap {
public static void main(String[] args) {
Map<String, String> map = new ConcurrentHashMap<>();
map.put("one", "one");
map.put("two", "two");
map.put("three", "three");
System.out.println("1st map : "+map);
String key = null;
for(Map.Entry<String, String> itr : map.entrySet())
{
key = itr.getKey();
if("three".equals(key))
{
map.put("FOUR", "FOUR");
}
System.out.println(key+" ::: "+itr.getValue());
}
System.out.println("2nd map : "+map);
//map.put("FIVE", null);//java.lang.NullPointerException
map.put(null, "FIVE");//java.lang.NullPointerException
System.out.println("3rd map : "+map);
}
}
동기화된 해시맵 예제
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class Ex_Synchronizedmap {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("one", "one");
map.put("two", "two");
map.put("three", "three");
map.put("FOUR", null);
map.put(null, "FIVE");
System.out.println("map : "+map);
Map<String, String> map1 =
Collections.synchronizedMap(map);
System.out.println("map1 : "+map1);
String key = null;
for(Map.Entry<String, String> itr : map1.entrySet())
{
key = itr.getKey();
if("three".equals(key))
{
map1.put("ABC", "ABC");
}
System.out.println(key+" ::: "+itr.getValue());
}
System.out.println("New Map :: "+map1);
Iterator<Entry<String, String>> iterator = map1.entrySet().iterator();
int i = 0;
while(iterator.hasNext())
{
if(i == 1)
{
map1.put("XYZ", "XYZ");
}
Entry<String, String> next = iterator.next();
System.out.println(next.getKey()+" :: "+next.getValue());
i++;
}
}
}
Java 문서에 따라
해시 테이블 및 컬렉션.syncedMap(새 해시맵())이 동기화된다.그러나 ConcurrentHashMap은 "동류"이다.
동시 수집은 스레드 안전하지만 단일 제외 잠금에 의해 제어되지 않는다.
ConcurrentHashMap의 경우, 조정 가능한 동시 쓰기 수뿐만 아니라 모든 수의 동시 읽기를 안전하게 허용한다."동기화" 클래스는 확장성이 떨어지는 비용을 감수하고 단일 잠금을 통해 컬렉션에 대한 모든 액세스를 방지해야 할 때 유용할 수 있다.
여러 개의 스레드가 공통 컬렉션에 액세스할 것으로 예상되는 다른 경우에는 일반적으로 "동시" 버전이 바람직하다.그리고 동기화되지 않은 컬렉션은 컬렉션 중 하나를 공유하지 않거나 다른 잠금 장치를 잡고 있을 때만 액세스할 수 있는 것이 바람직하다.
참조URL: https://stackoverflow.com/questions/1291836/concurrenthashmap-vs-synchronized-hashmap
'Programing' 카테고리의 다른 글
Vuex 디스패치가 반환되지 않음 (0) | 2022.05.02 |
---|---|
C에서 char 배열을 복사하는 방법? (0) | 2022.04.29 |
현재 C 또는 C++ 표준 문서는 어디에서 찾을 수 있는가? (0) | 2022.04.29 |
Vuex 2.0 디스패치 대 커밋 (0) | 2022.04.29 |
사전 정의된 CSS 스타일을 Vue에서 생성하는 방법(각도에서 할 수 있는 것처럼) (0) | 2022.04.29 |