Language/Java

Language/Java

[모던 자바 인 액션] Ch 1 자바 8, 9, 10, 11 : 무슨 일이 일어나고 있는가?

모던 자바 인 액션 1장을 읽고 느낀 건, 이펙티브 자바 보기 전에 봤으면 더 좋았을 거 같다. 스트림 잘 모르던 시절에 때려넣은 이펙티브 자바 ^^ .. 이 책에서 친절히 설명해준다. 또 같은 내용만 몇 번을 반복해서 강조한다. 이렇게 친절할 수가 .... 1장은 이후에 나올 내용들의 큰 그림을 그려주는 내용이다. 자바 8은 왜 변화를 했는지, 어떤 변화가 있었는지 등 .. 오모시로이 자바와 멀티코어 병렬성 멀티코어 CPU가 대중화되면서 프로그래밍 언어의 발전에 큰 영향을 미쳤다. 이전까지 자바 프로그램은 주로 단일 코어를 활용했고, 나머지 코어는 대부분 idle 상태였다. 멀티코어 프로세서의 효율적인 활용을 위해, 자바는 시간이 지나면서 병렬 실행 환경을 쉽게 관리하고 에러가 덜 발생하기 위해 진화해..

Language/Java

[effective java] 아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라.

핵심 요약 스레드 스케줄러 동작은 플랫폼마다 다를 수 있으므로, 프로그램이 스레드 스케줄링 정책에 의존하면 안 된다. Thread.yield나 스레드 우선순위 조정같은 스케줄러 관련 기능에 의존하는 것은 이식성을 해칠 수 있으며, 신뢰성을 낮춘다. 올바른 동시성 제어나 프로그램 설계를 통해 동시에 실행 가능한 스레스 수를 최소화하는 것이 좋다. 자바 스레드 생명 주기 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 결정하는데, 구체적 스케줄링 정책은 운영체제마다 다를 수 있다. 프로그램이 스레드 스케줄링 정책에 의존적이라면, 해당 프로그램의 동작이나 성능이 운영체제마..

Language/Java

[effective java] 아이템 83. 지연 초기화는 신중히 사용하라.

핵심 요약 일반적으로 필드는 지연시키지 말고 곧바로 초기화해야 한다. 성능 혹은 초기화 순환을 막기 위해 꼭 지연 초기화를 써야 한다면 제대로 사용하라. ✨ 적절한 초기화 방법 선택 가이드 더보기 일반적인 초기화: 대부분의 상황에서 적절한 방법 synchronized 접근자: 인스턴스 필드에 적절하나 이중 검사 관용구가 더 좋은 방법 홀드 클래스 관용구: 정적 필드에 적절한 방법 이중 검사 관용구: 인스턴스 필드에 적절한 방법 단일 검사 관용구: 여러 번 초기화해도 문제가 없는 인스턴스 필드에 고려할 수 있는 방법 짜릿한 단일 검사 관용구: 대부분의 상황에서 권장되지 않는 방법 지연 초기화(lazy initialization) 객체나 데이터를 실제로 필요한 순간까지 초기화하지 않는 기법이다. 장점 메모리..

Language/Java

[effective java] 아이템 82. 스레드 안전성 수준을 문서화하라.

핵심 내용 모든 클래스를 자신의 스레드 안전성 정보를 명확히 문서화해야 한다. 정확한 언어로 명확히 설명하거나 스레드 안전성 애너테이션을 사용할 수 있다. synchronized 한정자는 문서화와 관련이 없다. 조건부 스레드 안전 클래스는 메소드를 어떤 순서로 호출할 때 외부 동기화가 요구되고, 그때 어떤 락을 얻어야 하는지도 알려줘야 한다. 무조건적 스레드 안전 클래스를 작성할 때는 synchronized 메소드가 아닌 비공개 락 객체를 사용하자. 클라이언트나 하위 클래스에서 동기화 메커니즘을 깨뜨리는 걸 예방할 수 있다. API 문서에서 synchronized 한정자 : synchronized 한정자만으로 스레드 안전성을 판단하는 것은 위험하다. 메소드의 내부 구현이나 호출하는 다른 메소드들과의 상호..

Language/Java

[effective java] 아이템 81. wait와 notify보다는 동시성 유틸리티를 애용하라.

핵심 요약 당연히 wait와 notify가 아닌 동시성 유틸리티를 사용하라. 레거시 코드를 다룰 경우, wait는 항상 표준 관용구에 따라 while 문 안에서 호출하라. 일반적으로 notify보다는 notifyAll을 사용해야 한다. notify을 사용할 경우 응답 불가 상태에 빠지지 않도록 주의하자. 동시성 유틸리티 : 자바 5 이후 wait와 notify로 하드코딩해야 했던 전형적인 일들을 대신 해준다. java.util.concurrent의 고수준 유틸리티는 세 범주로 나눌 수 있다. 1. 실행자 프레임워크(item 80) 2. 동시성 컬렉션(concurrent collection) 3. 동기화 장치(synchronizer) 동시성 컬렉션(concurrent collection) 표준 컬렉션 인터..

Language/Java

[effective java] 아이템 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라.

핵심 내용 스레드를 직접 다루는 대신 실행자 프레임워크와 태스크를 활용하고, 병렬 처리는 스트림을 통해 진행하자. 이렇게 하면 작업과 실행 메커니즘이 분리되며, 실행자는 태스크의 수행 정책을 선택하게 해주며, 병렬 처리를 효과적으로 수행할 수 있다. java.util.concurrent 패키지 : 실행자 프레임워크(Executor Framework) 해당 패키지가 나오기 이전에는 작업 큐를 사용하려면 안전 실패나 응답 불가능한 문제를 해결하기 위한 코드를 추가해야 했다. java.util.concurrent 패키지가 등장하면서 실행자 프레임워크(Executor Framework)를 제공한다. // 작업 큐를 생성하다. (ExecutorService는 실행자 서비스를 나타내는 인터페이스) ExcutorSe..

Language/Java

[effective java] 아이템 79. 과도한 동기화는 피하라.

핵심 요약 교착 상태와 데이터 훼손을 피하려면 동기화 영역 안에서 외계인 메소드를 절대 호출하지 말자. 동기화 영역 안에서의 작업은 최소한으로 줄이자. 가변 클래스를 설계할 때는 스레드 안전한 클래스를 만들지에 대한 여부를 고민하자. 그리고 이를 문서에 명기하자. 과도한 동기화 동기화는 프로그램 안정성을 보장하기 위해 중요하지만, 과도하게 사용하면 성능 저하, 교착 상태, 예측할 수 없는 동작 등의 문제를 야기할 수 있다. 동기화된 영역에서는 클라이언트에게 제어를 양도하면 안 된다. 예를 들어, 재정의할 수 있는 메소드 호출이나 클라이언트가 전달한 함수 객체 호출은 동기화된 영역에서 예측 불가능한 문제를 발생시킬 수 있다. ❔ 외계인 메소드 더보기 외계인 메서드란 동기화된 영역 안에서 재정의 메서드를 호..

Language/Java

[effective java] 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라.

핵심 요약 멀리 스레드 환경에서 가변 데이터를 공유할 때는 데이터의 일관성과 안정성을 위해 동기화를 사용하라. 데이터를 동기화하지 않으면 에측할 수 없는 결과나 안전 실패(safe failure)가 발생할 수 있다. 최적의 성능과 안정성을 위해 가변 데이터는 가능한 한 단일 스레드 내에서만 사용하거나, 필요한 부분만 동기화하라. 동기화의 기능 배타적 실행 (Exclusive Execution) synchronized 키워드는 해당 메소드나 블록을 한 번에 하나의 스레드만 실행할 수 있도록 보장한다. 동기화된 메소드를 사용하면, 한 스레드가 객체의 상태를 변경하는 도중에 다른 스레드가 해당 객체의 상태를 읽거나 변경하는 것을 방지할 수 있다. 즉, 동기화를 통해 객체의 상태가 항상 일관된 상태를 유지하도록..

JOYERIM
'Language/Java' 카테고리의 글 목록