You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
1. 동시성 컬렉션이 필요한 이유 - 시작
java.util)는 대부분 스레드 세이프(Thread Safe)하지 않음SimpleList 인터페이스와 구현체
동시성 테스트를 위한 리스트 구현
2. 동시성 문제 분석 - 멀티스레드 테스트
2개의 스레드가 동시에
BasicList에 데이터를 추가할 때 어떤 결과가 발생하는지 확인멀티스레드 실행 코드
실행 결과 및 문제점
null이 포함되거나 사이즈가 맞지 않는 현상이 발생함[A, null]이 결과로 나올 수도 있음3. 원인 파악:
add()연산의 비원자성add()메서드는 겉으로 보기엔 단순하지만 내부적으로는 여러 단계로 나뉘어 실행1단계: 데이터 덮어쓰기 (Data Overwrite)
스레드 1:
size가 0인 것을 확인하고elementData[0]에 "A"를 넣습니다.스레드 2: 거의 동시에
size를 0으로 읽고elementData[0]에 "B"를 넣습니다.결과: 인덱스 0번에 저장되었던 "A"는 사라지고 "B"만 남게 됩니다. (Lost Update 발생)
size++연산size++는 내부적으로 다음과 같은 과정을 거침size값을 읽음.size변수에 저장.만약 두 스레드가 동시에
size를 0으로 읽었다면, 둘 다 1을 더해 저장하게 되어 최종size가 2가 아닌 1이 될 수도 있게 됨ArrayList,LinkedList,HashMap등 우리가 자주 사용하는 컬렉션들은 절대로 스레드 세이프 하지 않음.4. 동시성 컬렉션이 필요한 이유 3 - 동기화
컬렉션의 복잡한 연산을 멀티스레드 환경에서 안전하게 보호하기 위해
synchronized키워드를 사용하여 **임계 영역(Critical Section)**을 설정할 수 있음SyncList 구현 (동기화 적용)
add()를 호출하여 **락(Lock)**을 획득하면, 스레드 2는 락이 반납될 때까지 BLOCKED 상태로 대기하여 데이터 유실을 방지함 .5. 동시성 컬렉션이 필요한 이유 4 - 프록시 도입
기존 코드를 수정하지 않고 동기화 기능만 추가하고 싶을 때 프록시 패턴을 사용할 수 있음
프록시 패턴의 구조
SyncProxyList 구현
BasicList)를 전혀 수정하지 않고도 동기화 기능을 적용할 수 있으며, 인터페이스만 같다면 어떤 리스트 구현체에도 재사용이 가능함프록시 패턴이란?
객체에 대한 접근 제어하는 것이 핵심 목적
원래 객체에 대한 접근을 통제하거나, 원격 호출이나 지연 로딩(lazy loading)과 같은 추가 기능을 제공하기 위해 사용됨 (성능향상, 부가기능 추가)
주로 원래 객체와 동일한 인터페이스를 구현하여, 원래 객체와 동일하게 동작하도록 보장
주요 예시:
특징:
6. 자바 동시성 컬렉션 1 - synchronized 프록시
java.util패키지에 있는 컬렉션 프레임워크들은 대부분 스레드 안전(Thread Safe)하지 않음java.util.Collections클래스를 통해 기존 컬렉션을 스레드 세이프하게 감싸주는 프록시 생성 메서드들을 제공동시성 컬렉션 메서드
Collections.synchronizedList(new ArrayList<>())Collections.synchronizedMap(),Collections.synchronizedSet()등그러나, synchronized 프록시 방식은 단점이 존재
synchronized를 걸기 때문에 상황에 따른 미세한 조정이 불가능함.7. 자바 동시성 컬렉션 2 - 고성능 컬렉션
자바 1.5부터
java.util.concurrent패키지에서 고성능 멀티스레드 환경을 위한 **동시성 컬렉션(Concurrent Collection)**을 제공동시성 컬렉션의 특징
synchronized대신Lock(ReentrantLock),CAS, 분할 잠금(Segment Lock) 등 정교한 기술을 사용하여 성능을 최적화함.주요 클래스
CopyOnWriteArrayListCopyOnWriteArraySetCopyOnWriteArrayList기반의 SetConcurrentHashMapConcurrentSkipListSet/Map블로킹 큐 (BlockingQueue)
생산자-소비자 패턴에서 사용되며, 큐가 가득 차거나 비었을 때 스레드를 대기시키는 기능을 제공
ArrayBlockingQueue: 크기 고정.LinkedBlockingQueue: 크기 무한/고정 선택 가능.SynchronousQueue: 데이터를 저장하지 않고 직접 전달(Hand-off).8.정리
java.util.concurrent사용 권장. 고성능 멀티스레드 최적화가 적용되어 있음.AtomicInteger를, 복합 데이터 구조는ConcurrentHashMap등을 우선적으로 고려하게됨Beta Was this translation helpful? Give feedback.
All reactions