본문 바로가기

Java

(5)
Atomic Type Atomic Type이란? CAS 알고리즘을 사용해 동시성을 보장하는 Wrapping 자료형입니다. Atomic 타입은 어떻게 동시성을 보장할까? Atomic타입이 동시성을 어떻게 보장하는지 이해하려면 CAS 알고리즘에 대해 이해해야 합니다. CAS 알고리즘은 Compare And Swap 알고리즘으로 알고리즘 흐름도는 아래 그림과 같습니다. 멀티스레드 환경에서는 CPU가 메모리에서 변수값을 참조하는게 아니라 CPU의 캐시 영역에서 값을 참조하게 됩니다. 이 때, 메모리에 저장된 값과 CPU캐시에 저장된 값이 서로 다를 수 있습니다(가시성 문제). CAS 알고리즘은 현재 스레드에 저장된 값과 메모리에 저장된 값을 비교한 후 일치하면 새로운 값으로 교체하고, 일치하지 않는다면 실패하고 재시도하는 방식으로 ..
블로킹 큐(Blocking Queue) Blocking Queue 멀티 쓰레드 환경에서 사용되는 자료구조로, 큐의 상태에 따라 자원의 생성과 소비를 제어할 수 있는 큐입니다. 멀티쓰레드 환경에서 쓰레드를 대기시킬 때 주로 사용됩니다(Producer-Consumer 패턴). Blocking Queue는 자원의 생성과 소비를 담당하는 각각의 메서드로 Put과 Take를 사용합니다. Blocking Queue는 자원의 생성과 소비 과정에서 큐가 가득 차 있거나, 비어 있을 경우의 예외를 방지하기 위해 각각의 상황에서 큐를 블로킹합니다. 다음은 Blocking Queue의 구현체 중 하나인 ArrayBlockingQueue의 put과 take 메서드입니다. public void put(E e) throws InterruptedException { c..
[Item 7] 다 쓴 객체 참조를 해제하라 [Item 7] 다 쓴 객체 참조를 해제하라 핵심요약 자바에서는 가비지컬렉터가 메모리 누수를 관리해준다. 그러나 몇몇 특수한 경우에는 사용자가 직접 메모리 누수를 관리해야 한다. 자바에서의 메모리 누수 원인들 스스로 메모리를 직접 관리하는 클래스 캐시 참조 리스너와 콜백 1. 클래스가 직접 메모리를 관리 하는 경우 // 코드 1 - 메모리 누수를 고려 안하고 구현한 스택 class Stack { public Object[] elements; protected int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 4; public Stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } pub..
[item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. [Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 핵심요약 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 이럴 때는 의존 객체 주입 기법을 사용하자. 의존객체주입이란 필요한 인스턴스를 직접 생성하는 것이 아니고 외부에서 주입하여 객체 간 결합도를 줄이고 유연한 코드를 작성하게 하는 방법. // 코드 1 - 의존객체주입의 예 public class Computer { private Cpu cpu; public Computer(Cpu cpu) { this.cpu = cpu; } }부적절한 클래스 예시 // 코드 2 - 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static fina..
[Design Pattern] 싱글턴 패턴(Singleton pattern) 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스 시스템에서 유일성을 보장해야 하는 경우, 혹은 자원의 낭비를 막기 위해 생성한다. 싱글턴 객체는 mock 객체로 대체할 수 없기 때문에 클라이언트를 테스트하기 어려워 질 수 있다. 싱글턴을 생성하는 방법 1. private static final 필드 방식 // 코드 1 - 생성자 + static 방식 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {} public void leaveTheBuilding() {} } 코드 1의 장점 해당 클래스가 싱글턴임이 API에 명백히 드러 코드가 간결함 코드 1의 단점 권한이 있는 클라이언트는 리플렉..