[CS/운영체제] 멀티스레드와 동시성 - 28부

황제연·2025년 7월 27일
0

CS학습

목록 보기
148/193
post-thumbnail

컬렉션 프레임워크의 동기화

앞서 원자적인 연산을 제공하지 않는 경우가 있기 때문에,
멀티스레드 환경에서 여러 스레드가 제공하는 경우 컬렉션 프레임워크를 사용하면 안된다고 했습니다

하지만 그런 상황에서도 컬렉션 프레임워크를 사용해야하는 경우가 존재합니다
이런 상황을 위해 synchronized와 Lock등을 통해 안전한 임계영역을 만들면 문제를 해결할 수 있습니다

하지만 이렇게 한다면 모든 컬렉션들을 다 복사해서 동기화 목적으로 새로 구현해야합니다
이것은 매우 비효율적입니다

프록시 도입

ArrayList, LinkedList와 같은 코드를 모드 복사해서 synchronized 기능을 추가해야한다면
매우 복잡한 일이 될 것입니다

이런 복잡함을 해결할 때, 사용하는 것이 바로 프록시 패턴입니다

public class ProxyList implements OriginalList{
	private OriginalList target;
	
	public ProxyList target(OriginalList target){
		this.target = target;
	}

	@Override
	public synchronized void add(Object e){
		target.add(e);
	}
	...
}

이런 형식으로 만들어둔다면, 이제 관련 프레임워크마다 복사해서 사용할 필요 없이
ProxyList 객체 하나만 만들어서 원하는 컬렉션 프레임워크를 주입해주면 됩니다!

런타임 의존관계

사용자가 특정 메소드를 호출하면 런타임에 발생하는 인스턴스간 의존관계에 의해
먼저 프록시 객체에서 synchronized가 적용되고 원본 대상의 메소드가 호출됩니다

이후 원본 대상의 결과가 반환되고, 프록시 객체에서 synchronized가 해제되며
호출한 메소드로 반환됩니다

번외: 프록시 패턴

이런 방식을 앞서 말한 프록시 패턴이라고 합니다
어떤 객체에 대한 접근을 제어하기 위해 그 객체의 대리인 또는 인터페이스 역할을 하는
객체를 제공하는 패턴입니다

프록시 객체는 실제 객체에 대한 참조를 유지하면서, 그 객체에 접근하거나 행동을 수행하기 전에
추가적인 작업을 처리할 수 있도록 합니다

주요 목적

  • 접근제어: 실제 객체에 대한 접근을 제어하거나 통제할 수 있습니다
  • 성능 향상: 실제 객체 생성을 지연시키거나 캐싱해서 성능을 최적화할 수 있습니다
  • 부가기능 제공: 실제 객체에 추가적인 기능(인증, 로깅, 동기화 등등)을 제공할 수 있습니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글