스레드 안전성 멀티스레드 환경에서도 API를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다 스레드 안정성 높은 순 불변(immutable): 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다.String,Long,Biglnteger 무조건적 스레드 안전(unconditionally thread-safe):이 클래스의 인스턴스 는 수정될 수 있으나,내부에서 충실히 동기화하여 별도의 외부 동기화 없이 동시에 사용해도 안전하다. AtomicLong, ConcurrentHashMap이 여기에 속한다. 조건부 스레드 안전(conditionally thread-safe):무조건적 스레드 안전과 같으나,일부 메서드는 동시에 사용하려면 외부 동기화가 필요하다. ..
동시성 유틸리티 실행자 프레임워크 동시성 컬렉션(concurrent collection) 동기화 장치(synchroonizer) 동시성 컬렉션 표준 컬렉션 인터페이스에 동시성을 가미해 구현한 고성능 컬렉션 동기화한 컬렉션보다 동시성 컬렉션을 사용하는게 더 좋다. Collections.synchronizedMap보다는 ConcurrentHashMap을 사용하는게 훨씬 좋다 BlockingQueue 의 take 메소드는 큐의 첫 원소를 꺼내는데 큐가 비어있으면 새로운 원소가 추가 될때까지 기다린다(producer, consumer 큐로 쓰기 적합) 핵심 정리 wait와 notify를 직접 사용하는 것을 동시성 ‘어셈블리 언어’로 프로그래밍하는 것에 비유할 수 있다.반면 java.util.concurrent는..
실행자 프레임워크 자바의 실행자 프레임워크는 스레드에 대해 그리고 시스템에서 스레드가 사용하는 자원에 대한 새로운 차원의 제어를 가능하게 한다 실행자 프레임워크 기본 구성요소는 Executor 인터페이스다. 목표는 테스크의 생성을 분리하여, 응용프로그램의 동작을 가능하게 하는 것이다. 사용 예시 //작업 큐 생성 ExcutorService exec = Executors.newSingleThreadExecutor(); //실행자에 실행할 테스크를 넘기는 작업 exec.execute(runnable); //실행자 종료 exec.shutdown(); 이외에도 주요기능들이 있다 특정 태스크가 완료되기를 기다린다(코드 79-2에서 본 get 메서드) 태스크 모음 중 아무것 하나(invokeAny 메서드) 혹은 모..
동기화 블럭에서 제어를 클라이언트에 양도한 예시와 문제점 동기화된 영역 안 에서는 재정의할 수 있는 메서드는 호출하면 안 되며,클라이언트가 넘겨준 함수 객체(아이템 24)를 호출해서도 안 된다. 동기화된 영역을 포함한 클래스 관 점에서는 이런 메서드는 모두 바깥 세상에서 온 외계인이다. 그 메서드가 무슨 일을 할지 알지 못하며 통제할 수도 없다는 뜻이다. 외계인 메서드(alien method)가 하는 일에 따라 동기화된 영역은 예외를 일으키거나, 교착상태에 빠지거나, 데이터를 훼손할 수도 있다. public class ObservableSet extends ForwardingSet { public ObservableSet(Set set) { super(set); } private final List ob..
동기화란? 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장 동기화의 기능 동기화는 일관성이 깨진 상태를 볼 수 없게 하는 것은 물론, 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해준다 동기화가 없다면 한 스레드가 저장한 값이 다른 스레드에게 언제 '보일지' 알 수 없다. 동기화는 배타적 실행 뿐 아니라 스레드 사이의 안정적인 통신에 꼭 필요하다. 잘못된 코드 public class StopThread { private static boolean stopRequested; public static void main(String[] args) { Thread backgroundThread = new Thread(() -> {..
버그나 보안 문제를 줄이기 위해 직렬화 프록시 패턴이 있다 직렬화 프록시 패턴 바깥 클래스의 논리적 상태를 정밀하게 표현하는 중첩 클래스를 설계해 private static으로 선언한다. 이 중첩 클래스가 바깥 클래스의 직렬화 프록시다. 중첩 클래스의 생성자는 단 하나여야 하며, 바깥 클래스를 매개변수로 받아야 한다. 생성자는 유효성 검사 및 방어적 복사 없이 단순히 인스턴스의 데이터를 복사한다. 바깥 클래스와 직렬화 프록시 모두 Serializable을 구현한다. private static class SerializationProxy implements Serializable { private final Date start; private final Date end; SerializationProxy(..
싱글턴과 직렬화 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuild丄ng() { ... } } Serializable 을 추가하는 순간 더 이상 싱글턴이 아니게 된다 어떤 readObject()를 사용하든 이 클래스가 초기화될 때 만들어진 인스턴스와는 별개인 인스턴스를 반환한다. readResolve()를 사용하면 readObject()가 만들어낸 인스턴스를 다른 것으로 대체할 수 있다. 역직렬화된 새 인스턴스는 참조를 잃어 자동적으로 GC 대상이 된다. private Object readResolve() { return INSTANCE; }..
public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발행한다. */ public Period(Date start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); if(this.start.compareTo(t..
기본 직렬화 형태가 적합한 경우 객체의 물리적 표현과 논리적 내용이 같다면 기본 직렬화 형태라도 무방하다 기본 직렬화 형태가 적합하다고 결정했더라도 불변식 보장과 보안을 위해 readObject 메서드를 제공해야 할 때가 많다 직렬화 형태에 적합한 클래스 public class Name implements Serializable { /** * 성. null이 아니어야함 * @serial */ private final String lastName; /** * 이름. null이 아니어야 함. * @serial */ private final String firstName; /** * 중간이름. 중간이름이 없다면 null. * @serial */ private final String middleName; } 기..
Serializable 구현 클래스 선언에 implements Serializable만 붙이면 된다 Serializable 구현의 문제 Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다 직렬화 형태도 하나의 공개 API 가 된다 기본 직렬화 형태에서는 private와 package-private 인스턴스 필드들 마저 api로 공개하는 꼴이 된다(캡슐화 깨짐) 직렬화가 클래스 개선을 방해한다 UID(명시하지 않으면 런타임시 자동으로 생성해줌)를 생성할때 클래스 멤버들이 고려한다 나중에 수정을 한다면 UID 변한다 버그와 보안 구멍이 생길 위험이 높다 생성자를 사용해서 만드는게 기본인데 기본 메커니즘을 우회하는 객체 생성 기법이다 기본 역직렬화를 사용하면 불변식 깨짐과 허가되지 않은 접근에 ..
- Today
- Yesterday
- iterable
- Serialize
- nosql
- concurrency
- template
- in-memory
- 부하테스트
- Serializable
- reactive
- jdk11
- object
- gslb
- exception
- template method
- JMeter
- Redis
- observable
- Design Pattern
- 메인보드#asrock b650m #조립pc #후기이벤트
- Effective JAVA
- 영속성
- 디자인패턴
- Observer Pattern
- jvm
- strategy
- Spring
- LAMBDA
- Concurrecy
- reactive stream
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |