DEV ℧ Developer Diary

[Java] java.lang.NoClassDefFoundError: Could not initialize class org.xnio.channels.Channels (JDK의 Bug)

java.lang.NoClassDefFoundError: Could not initialize class org.xnio.channels.Channels

ava.lang.NoClassDefFoundError: Could not initialize class org.xnio.channels.Channels at io.undertow.servlet.spec.ServletOutputStreamImpl.close(ServletOutputStreamImpl.java:618) at io.undertow.servlet.spec.HttpServletResponseImpl.closeStreamAndWriter(HttpServletResponseImpl.java:486) at io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:575) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:351) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) at io.undertow.servlet.handlers.ServletInitialHandler<span...

[EffectiveJava] item80 - 스레드보다는 실행자, 태스크, 스트림을 애용하라

실행자 프레임워크(ExecutorService)

이 책의 2판이 나오기 앞서 java.util.concurrent 패키지가 등장했다.

이 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다.

실행자 프레임워크는 클라이언트가 요청한 작업을 백그라운드 스레드에 위임해 비동기적으로 처리하는데, 앞서 구현한 초판의 코드보다 모든 면에서 뛰어난 작업...

[EffectiveJava] item79 - 과도한 동기화는 피하라

저번 Item에서는 충분하지 못한 동기화의 피해를 다뤘다면, 이번엔 반대의 상황을 다뤄보자.

과도한 동기화

과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 예측할 수 없는 동작을 낳기도 한다.

응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다.

재정의할 수 있는 메서드나,...

[EffectiveJava] item78 - 공유 중인 가변 데이터는 동기화해 사용하라

synchronized 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다.

동기화

많은 프로그래머가 동기화를 배타적 실행,즉 한 스레드가 벼경하는 중이라서 상태가 일관되지 않은 순간의 객체를 다른 스레드가 보지 못하게 막는 용도로만 생각한다.

맞는 설명이지만, 동기화에는 중요한 기능이 하나 더 있다. 동기화 없이는...

[EffectiveJava] item77 - 예외를 무시하지 말라

너무 뻔한 조언 같지만 반복해 각인시켜야 할 정도로 사람들이 자주 어기는 방법이 있다.

API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다.

예외 무시

안타깝게도 예외를 무시하기란 아주 쉽다. 해당 메서드 호출을 try 문으로 감싼 후 catch...