Reference/Effective-Java

    [Effective-Java] Chapter11 #82. 스레드 안정성 수준을 문서화하라

    📌 API 문서 API 문서는 해당 클래스와 Client 사이의 중요한 계약이다. Multi-thread 환경에서 메서드가 어떻게 동작하는지 명시하지 않으면 Client는 나름의 가정을 해야 한다. 가정이 틀리다면 Client 프로그램은 Synchronize를 충분히 하지 못한다. (Item 78) 혹은 동기화를 지나치게 한 상태가 된다. (Item 79) API 문서에 synchronized 한정자가 모이는 메서드는 Thread-safe와 연관이 없다. 메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않는다. Thread-safe는 있고, 없고 기준이 아니라, 그 안에서도 안전성의 수준이 나뉜다. 📌 Levels of thread safety 다음은 Thread..

    [Effective-Java] Chapter11 #81. wait와 notify보다는 동시성 유틸리티를 애용하라

    📌 As-is. wait & notify 💡 wait와 notify는 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하라 public class ThreadB extends Thread{ // 해당 쓰레드가 실행되면 자기 자신의 모니터링 락을 획득 // 5번 반복하면서 0.5초씩 쉬면서 total에 값을 누적 // 그후에 notify()메소드를 호출하여 wiat하고 있는 쓰레드를 깨움 @Override public void run(){ synchronized(this){ for(int i=0; i { int index = number % 3; synchronizedMap.get(names.get(index)); }); long end = System.nanoTime(); System.o..

    [Effective-Java] Chapter11 #80. 스레드보다는 실행자, 태스크, 스트림을 애용하라

    📌 As-is. 직접 구현한 작업 큐(work queue) Table of Contents Работа по теме: Effective Java Programming Language Guide - Bloch J. Глава: Table of Contents. Предмет: Программирование. ВУЗ: ТНУ. studfile.net 참고로 Effective Java 초판의 Item 49에서는 단순한 work queue를 만들어 소개했었다. Client 요청 작업을 Background Thread에 위임해 비동기적으로 작업을 처리한다. work queue가 필요 없어지면 Client가 queue에 중단을 요청할 수 있다. Queue는 남아 있는 작업을 마저 완료한 후 스스로 종료한다. Sa..

    [Effective-Java] Chapter11 #79. 과도한 동기화는 피하라

    👽 외계인 메서드(alien method) DeadLock과 Safety Failure를 피하려면 동기화 메서드 혹은 블럭 안에서는 제어를 클라이언트에게 넘기지 마라 동기화된 영역 안에서는 재정의할 수 있는 메서드를 호출하지 마라 클라이언트가 넘겨준 함수 객체(Item 24)를 호출해서도 안 된다. 동기화된 영역을 포함한 클래스에서 외계인 메서드는 Exception, 혹은 Dead Lock에 빠트리거나, Safety Failure를 유발할 수 있다. 🚫 As-is @FunctionalInterface public interface SetObserver{ // ObservableSet에 원소가 더해지면 호출된다. void added(ObservableSet set, E element); } BiConsum..