반응형

전 글에서 CAS 연산을 다룬 후 컬랙션 동시성에 대해 글을 작성해보려한다.
Collection 동시성?
자바에서는 List, Map, Set 컬랙션들은 기본적으로 동기화가 되어있지 않기 때문에, 멀티쓰레드 환경에서 사용할 경우 동기화를 고려해야한다.
해결방법
1. 프록시를 사용하여 synchronized를 메서드 마다 붙여서 동시성을 보장해준다.
2. Collections.synchronizedXXX() 이라는 동기화된 컬렉션을 사용한다.
사실 1번과 2번 둘다 사용할 수 는 있지만, 현업에서는 더 간편하고 효율적으로 사용하기 위해서 java.util.concurrent를 사용한다.
종류
(1) Concurrent List
클래스특징
CopyOnWriteArrayList<E> | - 읽기 연산이 많고, 쓰기 연산이 적을 때 사용. - 내부적으로 쓰기 시 새로운 배열을 복사 후 변경. - synchronizedList 보다 성능이 좋음. |
(2) Concurrent Set
클래스특징
CopyOnWriteArraySet<E> | - CopyOnWriteArrayList 기반으로 동작. - 중복 허용 안 함. - 읽기 연산이 많고, 쓰기 연산이 적을 때 적합. |
ConcurrentSkipListSet<E> | - 내부적으로 ConcurrentSkipListMap 기반. - 정렬된 상태 유지 (TreeSet 대체 가능). |
(3) Concurrent Map
클래스특징
ConcurrentHashMap<K, V> | - HashMap 대체 가능. - 내부적으로 segment 기반 동기화 처리 (Java 8 이후 CAS 기반 최적화). - 동기화 성능이 우수. |
ConcurrentSkipListMap<K, V> | - TreeMap 대체 가능. - 정렬된 상태 유지. |
가 있다.

반응형
'JAVA' 카테고리의 다른 글
태태개발일지 - JAVA 고급편(3) 김영한 람다 (1) | 2025.05.02 |
---|---|
태태코딩 - 람다(김영한 실전자바 고급 3편) (1) | 2025.04.27 |
태태개발일지 - 자바 고급 (김영한) CAS 연산 (1) | 2025.03.17 |
태태개발일지 - java 고급 멀티스레드(김영한) (1) | 2025.03.08 |
태태개발일지 - java 고급 멀티스레드 (1) | 2025.03.06 |