스레드 스케줄러 여러 스레드가 실행중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다. 스레드 스케줄링 정책은 OS다를 수 있기 때문에, 프로그램은 이 정책에 좌지우지 되어서는 안된다. 특징 이식성 좋은 프로그램은 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지 않도록 하는 것이다. 스레드 스케줄러가 고민할 거리가 줄어든다. 실행 가능한 스레드의 수는 전체 스레드 수와 다르다. 실행 준비가 된 스레드들은 맡은 작업을 완료할 때까지 계속 실행되도록 만든다. 실행 가능한 스레드 수를 적게 유지하는 방법은 각 스레드가 작업을 완료한 후 다음 일거리가 생길 때까지 대기하도록 하는 것이다. 당장 처리해야 할 작업이 없다면 실행돼서는 안 된다. 스레드 풀을 적절히 설..
지연초기화 필드의 초기화 시점을 그 값이 처음 필요할때까지 늦추는 기법이다 그래서 값이 전혀 쓰이지 않으면 초기화도 일어나지 않는다 대부분의 상황에서 일반적인 초기화가 지연 초기화보다 낫다 지연 초기화가 초기화 순환성(initialization circularity)을 깨뜨릴 것 같으면 synchronized를 단 접근자를 사용 private FieldType field; private synchronized FieldType getFieldO { if (field = null) field = computeFieldValue〇; return field; } 성능 때문에 정적 필드를 지연 초기화해야 한다면 지연 초기화 홀더 클래스 (lazy initialization holder class) 관용구를 사용..
스레드 안전성 멀티스레드 환경에서도 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 메서드) 혹은 모..
동기화란? 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장 동기화의 기능 동기화는 일관성이 깨진 상태를 볼 수 없게 하는 것은 물론, 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해준다 동기화가 없다면 한 스레드가 저장한 값이 다른 스레드에게 언제 '보일지' 알 수 없다. 동기화는 배타적 실행 뿐 아니라 스레드 사이의 안정적인 통신에 꼭 필요하다. 잘못된 코드 public class StopThread { private static boolean stopRequested; public static void main(String[] args) { Thread backgroundThread = new Thread(() -> {..
- Today
- Yesterday
- Spring
- iterable
- 메인보드#asrock b650m #조립pc #후기이벤트
- Serialize
- Serializable
- JMeter
- Concurrecy
- Design Pattern
- object
- in-memory
- Observer Pattern
- nosql
- LAMBDA
- Effective JAVA
- Redis
- observable
- gslb
- reactive stream
- template
- jvm
- strategy
- 디자인패턴
- 부하테스트
- concurrency
- template method
- reactive
- exception
- 영속성
- Java
- jdk11
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |