English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 흐름 제어

Java 배열

Java object-oriented(I)

Java object-oriented(II)

Java object-oriented(III)

Java 예외 처리

Java 리스트(List)

Java Queue(큐)

Java Map 컬렉션

Java Set 컬렉션

Java 입력/출력(I/O)

Java Reader/Writer

Java 다른 주제

Java ConcurrentHashMap

이 튜토리얼에서는 예제를 통해 Java ConcurrentHashMap 클래스와 그 작업을 배울 것입니다.

Java 컬렉션 프레임워크의 ConcurrentHashMap 클래스는 동기화된 맵을 제공합니다. 즉, 여러 스레드가 동시에 맵에 접근할 수 있으며, 맵의 항목 일관성에 영향을 미치지 않습니다.

을 상속합니다.ConcurrentMap 인터페이스.

ConcurrentHashMap 생성

동기화된 해시 테이블을 생성하기 위해 먼저 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 생성

다른 맵의 모든 요소를 포함한 병합 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의 메서드

ConcurrentHashMap 클래스는 맵에서 다양한 작업을 수행할 수 있는 메서드를 제공합니다.

요소를 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}

ConcurrentHashMap 요소에 접근합니다

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

ConcurrentHashMap 요소를 제거합니다

  • 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의 배치 작업 메서드

ConcurrentHashMap 클래스는 병행적으로 적용할 수 있는 다양한 배치 작업 메서드를 제공합니다.

1. forEach() 메서드

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() - 지정된 함수를 각 값에 대해 실행합니다

2. search() 메서드

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() - 검색 함수는 단순히 값에 적용됩니다

3. reduce() 메서드

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과HashMap끼리의 차이점 중 일부는 다음과 같습니다.

  • ConcurrentHashMap은스레드 안전집합. 즉, 여러 스레드가 동시에 접근하고 수정할 수 있습니다.

  • ConcurrentHashMap은 forEach(), search(), reduce()와 같은 배타적 작업을 수행할 수 있는 메서드를 제공합니다.

왜 ConcurrentHashMap을 선택하는가?

  • ConcurrentHashMap 클래스는 여러 스레드가 동시에 수정 작업을 병행할 수 있도록 합니다.

  • 기본적으로, 병행 해시 맵은 다음과 같이 분할됩니다.16구간따라서, 다음과 같은 허용된 이유가 있습니다.16개의 스레드가 동시에 맵을 수정하는 이유입니다. 하지만, 동시에 얼마든지 많은 스레드가 접근할 수 있습니다.

  • 지정된 키가 이미 존재하면 putIfAbsent() 메서드는 맵 내의 항목을 덮어쓰지 않습니다.