English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 예제를 통해 Java ConcurrentHashMap 클래스와 그 작업을 배울 것입니다.
Java 컬렉션 프레임워크의 ConcurrentHashMap 클래스는 동기화된 맵을 제공합니다. 즉, 여러 스레드가 동시에 맵에 접근할 수 있으며, 맵의 항목 일관성에 영향을 미치지 않습니다.
을 상속합니다.ConcurrentMap 인터페이스.
동기화된 해시 테이블을 생성하기 위해 먼저 java.util.concurrent.ConcurrentHashMap 패키지를 가져와야 합니다. 패키지를 가져온 후 Java에서 동기화된 해시 맵을 생성할 수 있습니다.
//ConcurrentHashMap은 용량을 가지고 있습니다.8또한 부하 요인 0.6 ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>();8, 0.6f);
위의 코드에서는 numbers라는 이름의 동기화된 해시 맵을 생성했습니다.
이곳에서는,
Key - 맵의 각 요소(값)과 연결된 독특한 식별자
Value - 키와 연결된 맵의 요소
주의하십시오. new ConcurrentHashMap<>() 문은8, 0.6)입니다. 여기서 첫 번째 매개변수는capacity두 번째 매개변수는loadFactor.
capacity -이 맵의 용량은8이는 다음과 같은 의미를 가집니다.8개의 항목이 있습니다.
loadFactor-이 맵의 부하 요인은 0입니다.6이는 우리의 해시 테이블이 가득 차면60%, 항목은 원래 해시 테이블의 두 배 크기인 새 해시 테이블로 이동합니다.
기본 용량과 부하 요인
용량과 부하 요인을 정의하지 않고도 동기화된 해시 테이블을 생성할 수 있습니다. 예를 들어,
// 가격이 기본 용량과 부하 요인을 가진 ConcurrentHashMap ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();
기본적으로
맵의 용량은 16
부하 인덱스는 0이 될 것입니다.75
다른 맵의 모든 요소를 포함한 병합 ConcurrentHashMap을 생성하는 방법입니다.
import java.util.concurrent.ConcurrentHashMap; import java.util.HashMap; class Main { public static void main(String[] args) { // 짝수의 hashmap을 생성 HashMap<String, Integer> evenNumbers = new HashMap<>(); evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); System.out.println("HashMap: ", + evenNumbers); //기타 맵에서 병합한 ConcurrentHashMap 생성 ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(evenNumbers); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); } }
출력 결과
HashMap: {Four=4, Two=2} ConcurrentHashMap: {Four=4, Two=2, Three=3}
ConcurrentHashMap 클래스는 맵에서 다양한 작업을 수행할 수 있는 메서드를 제공합니다.
put() - 지정된 키를/값 매핑을 맵에 삽입
putAll() - 지정된 맵의 모든 항목을 이 맵에 삽입
putIfAbsent() - 지정된 키가 맵에 존재하지 않으면/값 매핑을 맵에 삽입
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { //짝수의 ConcurrentHashMap을 생성 ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>(); // put()를 사용하여 evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); // putIfAbsent()를 사용하여 evenNumbers.putIfAbsent("Six", 6); System.out.println("짝수의 ConcurrentHashMap: ", + evenNumbers); //numbers의 ConcurrentHashMap을 생성 중 ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); // putAll()를 사용하여 numbers.putAll(evenNumbers); System.out.println("ConcurrentHashMap의 숫자는: ", + numbers); } }
출력 결과
짝수의 ConcurrentHashMap: {Six=6, Four=4, Two=2} ConcurrentHashMap의 숫자는: {Six=6, One=1, Four=-4, Two=2}
1.entrySet(), keySet() 및 values()를 사용하여
entrySet() - 모든 키를 반환합니다./값 매핑의 집합
keySet() - 모든 키를 포함한 맵의 값을 반환합니다.
values() - 모든 값을 포함한 맵의 값을 반환합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); // entrySet()를 사용하여 Key/Value 매핑: " + numbers.entrySet()); // keySet()를 사용하여 System.out.println("Keys: " + numbers.keySet()); // values()를 사용하여 System.out.println("Values: " + numbers.values()); } }
출력 결과
ConcurrentHashMap: {One=1, Two=2, Three=3} Key/Value 매핑: [One=1, Two=2, Three=3] Keys: [One, Two, Three] Values: [1, 2, 3]
2.get()와 getOrDefault()를 사용하여
get() - 지정된 키와 연결된 값을 반환합니다. 키를 찾지 못하면 null을 반환합니다.
getOrDefault() - 지정된 키와 연결된 값을 반환합니다. 키를 찾지 못하면 지정된 기본 값을 반환합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); // get()를 사용합니다 int value1 = numbers.get("Three"); System.out.println("get()를 사용하여: " + value1); // getOrDefault()를 사용합니다 int value2 = numbers.getOrDefault("Five", 5); System.out.println("getOrDefault()를 사용하여: " + value2); } }
출력 결과
ConcurrentHashMap: {One=1, Two=2, Three=3} get()를 사용하여: 3 getOrDefault()를 사용하여: 5
remove(key) - 지정된 키와 연결된 항목을 맵에서 반환하고 제거합니다.
remove(key, value) - 지정된 키가 지정된 값에 매핑되어 부울 값을 반환할 때만 맵에서 항목을 제거합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); //단일 파라미터 삭제 메서드 int value = numbers.remove("Two"); System.out.println("삭제된 값: " + value); // 삭제 메서드가 두 개의 파라미터를 가지고 있습니다. boolean result = numbers.remove("Three", 3); System.out.println("항목 {Three=")}}3} 제거되었나? " + result); System.out.println("업데이트된 ConcurrentHashMap: "); + numbers); } }
출력 결과
ConcurrentHashMap: {One=1, Two=2, Three=3} 제거된 값: 2 항목 {Three=3} 제거되었나? True 업데이트된 ConcurrentHashMap: {One=1}
ConcurrentHashMap 클래스는 병행적으로 적용할 수 있는 다양한 배치 작업 메서드를 제공합니다.
forEach() 메서드는 우리의 항목을 순회하며 지정된 함수를 실행합니다.
그것은 두 개의 매개변수를 포함합니다.
parallelismThreshold -이는 맵에서 몇 개의 요소가 병행적으로 작업을 수행하는지 지정합니다.
transformer -이는 데이터를 지정된 함수에 전달하기 전에 데이터를 변환합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); //forEach()에는 전달된 함수가 포함되지 않습니다 numbers.forEach(4, (k, v) -> System.out.println("key: " + k + " value: " + v)); // forEach()를 통해 지정된 함수를 전달합니다 System.out.print("Values are "); numbers.forEach(4, (k, v) -> v, (v) -> System.out.print(v + , "); } }
출력 결과
ConcurrentHashMap: {One = 1, Two = 2, Three = 3} key: One value: 1 key: Two value: 2 key: Three value: 3 Values are 1, 2, 3,
위의 프로그램에서는 병행 히스토그램을 사용했습니다.4. 이는 맵에 몇 개의 요소가 포함되어 있으면 병행적으로 작업을 수행하는 것을 의미합니다.4개의 항목이 있으면, 이 작업은 병행적으로 수행됩니다.
forEach() 메서드의 변형
forEachEntry() - 지정된 함수를 각 항목에 대해 실행합니다
forEachKey() - 지정된 함수를 각 키에 대해 실행합니다
forEachValue() - 지정된 함수를 각 값에 대해 실행합니다
search() 메서드는 지정된 함수를 기반으로 맵을 검색하고 일치하는 항목을 반환합니다.
여기서, 지정된 함수가 무엇을 검색할지를 결정합니다.
그리고 선택적인 매개변수 parallelThreshold가 있습니다. 병행 히스토그램은 맵에서 얼마나 많은 요소가 있을 때 병행적으로 작업을 수행하는지 지정합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); // search()를 사용하여 String key = numbers.search(4, (k, v) -> {return v == 3 ? k: null;}); System.out.println("검색된 값: " + key); } }
출력 결과
ConcurrentHashMap: {One=1, Two=2, Three=3} 검색된 값: Three
search() 메서드의 변형
searchEntries() - 검색 함수는 키에 적용됩니다/값 매핑
searchKeys() - 검색 함수는 단순히 키에 적용됩니다
searchValues() - 검색 함수는 단순히 값에 적용됩니다
reduce() 메서드는 맵의 각 항목을 누적(집적)합니다. 이 메서드를 사용하여 모든 항목을 추가할 필요가 있는 일반적인 작업(예: 맵의 모든 값을 더하는 것)을 수행할 때 사용할 수 있습니다.
그것은 두 개의 매개변수를 포함합니다.
parallelismThreshold -그것은 몇 개의 요소가 지정된 후에 맵의 작업이 병행적으로 실행되도록 지정합니다.
transformer - 이는 지정된 함수에 데이터가 전달되기 전에 데이터를 변환하는 것입니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap; class Main { public static void main(String[] args) { ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("ConcurrentHashMap: " + numbers); // search()를 사용하여 int sum = numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1 + v2); System.out.println("모든 값의 합: " + sum); } }
출력 결과
ConcurrentHashMap: {One=1, Two=2, Three=3} 모든 값의 합: 6
위 프로그램에서 다음 문장에 주의하세요
numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1+v2);
이곳에서는,
4 은 병행 히스토그램입니다
(k, v) -> v는 변환 함수입니다. 그것은 키/값 매핑은 단순히 값으로 변환됩니다
(v1, v2) -> v1+v2 대소를 계산하는 함수입니다. 모든 값을 모아 모든 값을 더합니다.
reduce() 메서드의 변형
reduceEntries() - 이제 지정된 리듀서 함수를 사용하여 모든 항목의 결과를 모으는 것을 반환합니다
reduceKeys() - 이제 지정된 리듀서 함수를 사용하여 모든 키의 결과를 모으는 것을 반환합니다
reduceValues() - 지정된 리듀서 함수를 사용하여 모든 값을 모아 결과를 반환하는 것을 반환합니다.
다음은 ConcurrentHashMap과HashMap끼리의 차이점 중 일부는 다음과 같습니다.
ConcurrentHashMap은스레드 안전집합. 즉, 여러 스레드가 동시에 접근하고 수정할 수 있습니다.
ConcurrentHashMap은 forEach(), search(), reduce()와 같은 배타적 작업을 수행할 수 있는 메서드를 제공합니다.
ConcurrentHashMap 클래스는 여러 스레드가 동시에 수정 작업을 병행할 수 있도록 합니다.
기본적으로, 병행 해시 맵은 다음과 같이 분할됩니다.16구간따라서, 다음과 같은 허용된 이유가 있습니다.16개의 스레드가 동시에 맵을 수정하는 이유입니다. 하지만, 동시에 얼마든지 많은 스레드가 접근할 수 있습니다.
지정된 키가 이미 존재하면 putIfAbsent() 메서드는 맵 내의 항목을 덮어쓰지 않습니다.