Reading (65) 썸네일형 리스트형 [Effective-Java] Item 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라 병렬 작업 처리가 많아지면 스레드 개수가 증가되고 그에 따라 스레드 생성과 스케줄링으로 인해 CPU가 바빠져 메모리 사용량이 늘어나고 이는 애플리케이션 성능을 저하시킨다. 이런 갑작스런 병렬 작업 폭증이 야기하는 스레드 폭증을 막으려면 ThreadPool을 사용해야 한다. 스레드풀(ThreadPool) 작업 처리에 사용되는 스레드의 개수를 제한해 두고 작업 Queue에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다. 처리가 끝난 스레드는 다시 작업 Queue에서 새 작업을 가져와 처리한다. 그래서 작업이 폭증돼도 스레드 전체 개수가 늘지 않아 급격한 성능 저하가 없다. java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라는 인터페이스 기반의 유연한 태스크.. [Effective-Java] Item 79. 과도한 동기화는 피하라 과도한 동기화는 성능을 떨어뜨리고, 교착 상태에 빠뜨리며 예측할 수 없는 동작을 낳는다. 응답 불가와 안전 실패를 피하려면 동기화 메소드나 동기화 블록 안에서는 제어를 절대로 클라이언트에게 양도하지 말자. 재정의할 수 있는 메소드 호출이나 클라이언트가 넘겨준 함수 객체도 호출하면 안된다는 것이다. 그 메소드가 어떤 일을 할지 모르고, 통제할 수 없어서 예외 발생, deadlock, 데이터훼손을 일으킬 수 있다. 이러한 외부에서 오는 메소드를 외계인 메소드(alian method)라고 정의했다. 아이템 18에서 사용한 ForwardingSet을 재사용해 만든 옵저버 패턴으로 구현된 코드를 보자. [옵저버 패턴 참고] 관찰자들은 addObserver, removeObserver 메소드를 호출해 구독을 신청/.. [Effective-Java] Item 78. 공유 중인 가변 데이터는 동기화해 사용하라 synchronized: 해당 메소드나 블록을 한번에 한 스레드씩 수행하도록 보장하는 키워드 synchronized 키워드를 선언한 메소드는 메소드가 선언된 객체에 락을 걸고 메소드가 종료되면 락을 해제한다. synchronized 키워드를 선언한 블록은, 파라미터로 넘어간 객체에 락을 걸고 블록이 끝나면 락을 해제한다. 배타적 수행 기능 제공 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다. 즉, 한 스레드가 객체의 상태를 변경하는 중, 상태가 일관되지 않은 순간의 객체를 다른 스레드가 보지 못하게 락을 걸기 때문에 어떤 메소드도 객체의 일관되지 않은 상태를 볼 수 없다. 스레드 간 통신 기능 제공 동기화된 메소드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 .. [Effective-Java] Item 75~77. 예외의 상세 메시지에 실패 관련 정보를 담으라, 가능한 실패 원자적으로 만들라, 예외를 무시하지 말라 Item 75.예외의 상세 메시지에 실패 관련 정보를 담으라 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야한다 IndexOutOfBoundsException을 예로들면 상세 메시지로 범위의 최소와 최대값, 그리고 범위를 벗어난 인덱스를 모두 담으면 실패에 관한 정보를 얻기 쉽다. 최소와 최대가 예측이 되더라도 셋중 어떤 것이 잘못된지에 따라 현상이 다를 수 있다. 예를들어 내부 불변식이 깨져 최솟값이 최댓값보다 클수도 있다. 인덱스를 파라미터로 넘기는 게 있는데 이는 자바 9에와서 추가된 것이고 아쉽게 최솟값과 최댓값까지 받진 않는다. 생성자에서 필요한 정보를 받아 상세 메시지까지 작성하게하여 아래와 같이 작성할 수도 있을 것이다. public class.. 이전 1 2 3 4 5 ··· 17 다음