Backend/Java

[Java] ConcurrentHashMap 멀티스레드 환경에서 안전한 해시맵

누구세연 2024. 7. 28. 18:36

HashMap은 여러 스레드가 동시에 접근할 때 문제를 일으킬 수 있다는 사실 알고 계시나요??🤔

멀티스레드 환경에서 안전하게 사용할 수 있는 해시맵 구현체 ConcurrentHashMap에 대해 알아보겠습니다.

 

 

ConcurrentHashMap 이란?

ConcurrentHashMap은 자바 컬렉션 중 하나로, 여러 스레드가 동시에 안전하게 데이터를 읽고 쓸 수 있도록 설계된 해시맵입니다.

일반적인 HashMap과 달리 멀티스레드 환경에서 동기화 문제를 해결해 줍니다.

멀티스레드 환경에서 여러 스레드가 동시에 데이터를 수정하려고 하면, 데이터가 엉키거나 손실될 수 있습니다.

이를 해결하기 위해 HashMap 대신 ConcurrentHashMap을 사용합니다.

 

기본 동작 방식

ConcurrentHashMap은 내부적으로 여러 개의 분할 Lock을 사용합니다.

각 Lock은 해시맵의 일부에만 적용되어, 여러 스레드가 동시에 다른 부분을 수정할 수 있게 합니다.

이렇게 하면 전체 맥에 Lock을 거는 것보다 효율적입니다!

import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        // ConcurrentHashMap 생성
        Map<String, Integer> map = new ConcurrentHashMap<>();

        // 여러 스레드가 동시에 데이터를 추가
        Runnable task1 = () -> {
            for (int i = 0; i < 1000; i++) {
                map.put("key" + i, i);
            }
        };
        Runnable task2 = () -> {
            for (int i = 1000; i < 2000; i++) {
                map.put("key" + i, i);
            }
        };

        Thread thread1 = new Thread(task1);
        Thread thread2 = new Thread(task2);

        // 스레드 실행
        thread1.start();
        thread2.start();

        // 두 스레드가 작업을 마치기를 기다림
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // ConcurrentHashMap의 크기 출력
        System.out.println("Map size: " + map.size());  // 예상 결과: 2000
    }
}

이 예제에서 두 스레드는 동시에 ConcurrentHashMap에 데이터를 추가합니다.

각 스레드는 고유한 키를 사용하여 중복 없이 데이터를 삽입합니다.

최종적으로 맵의 크기는 2000이 됩니다.

 

주요 메서드

HashMap과 거의 동일하지만 ConcurrentHashMap은 동시성 제어를 위해 내부적으로 Lock을 사용하여 안전하게 작동합니다.

 

  • put(key, value): 맵에 키와 값을 추가합니다.
  • get(key): 키에 해당하는 값을 가져옵니다.
  • remove(key): 키에 해당하는 값을 제거합니다.
  • containsKey(key): 키가 존재하는지 확인합니다.

 

장점과 단점

장점

 

  1. 동시성
    여러 스레드가 동시에 안전하게 접근할 수 있습니다.
  2. 성능
    내부적으로 Lock을 분할하여 전체 Lock보다 성능이 뛰어납니다.
  3. 안전성
    멀티스레드 환경에서 데이터 무결성을 유지합니다.

단점

  1. 복잡성
    내부 구현이 복잡하여, 일반적인 HashMap보다 메모리 사용량이 많을 수 있습니다.
  2. 부분적 락
    여러 스레드가 동시에 같은 부분을 수정하려고 하면 성능 저하가 발생할 수 있습니다.

 

💡 ConcurrentHashMap은 멀티스레드 환경에서 데이터 무결성을 유지하면서도 높은 성능을 제공하는 자료구조입니다.
여러 스레드가 동시에 데이터를 수정하거나 읽는 상황에서 HashMap 대신 ConcurrentHashMap을 사용하면 안전하고 효율적인 데이터를 처리할 수 있습니다.