DEV ℧ Developer Diary

[EffectiveJava] item81 - wait와 notify보다는 동시성 유틸리티를 애용하라

wait와 notify는 Object 객체의 메서드로 스레드를 제어하는 기능이다.

wait() : wait()을 호출하면 현 스레드의 객체의 lock을 풀고 대기상태에 들어가면서 제어권을 다른 쓰레드에게 양보하게 됩니다. synchronized 블럭 내에서만 호출이 가능하며, 객체에 락이 걸려있지 않을 경우 에러를 발생합니다.

notify() : 대기하고 있는 스레드중 임의의...

[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 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다.

동기화

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

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