728x90
반응형

Java 80

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

🎯 아이템 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라. java.util.concurrent 두둥등장 실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있음 ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(runnable); exec.shutdown(); 🎯 아이템 81. wait와 notify보다는 동시성 유틸리티를 애용하라. wait와 notify는 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하자! java.util.concurrent의 고수준 유틸리티의 세 범주 1️⃣ 실행자 프레임워크 2️⃣ 동시성 컬렉션 3️⃣ 동기화 장치 1) 실행자 프레임워크는 앞에서..

Java 2023.04.15

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

🎯 아이템 79. 과도한 동기화는 피하라. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다. 동기화된 영역을 포함한 클래스 관점에서는 이런 메서드는 모두 바깥 세상에서 온 외계인이므로 예측할 수 없는 이슈를 발생 시킨다 잘못된 코드. 동기화 블록 안에서 외계인 메서드를 호출한다. public class ObservableSet extends ForwardingSet { public ObservableSet(Set set) { super(set); } private final List observers = new ArrayList(); public void addObserver(SetObserver observer) { synchronize..

Java 2023.04.13

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

🎯 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라. synchronized 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. 한 개체가 일관된 상태를 가지고 생성되고, 이 객체에 접근하는 메서드는 그 객체에 락(lock)을 건다. 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정한다. 즉, 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다. 동기화 없이는 한 스레드가 만든 변화를 다른 스레드에서 확인하지 못할 수 있다. 동기화는 일관성이 깨진 상태를 볼 수 없게 하는 것은 물론, 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해준다. 동기화는 배타적 실행뿐 아니라 스레드 사이의 안정적인 통신에 꼭 필..

Java 2023.04.12

[Effective Java] 아이템 77. 예외를 무시하지 말라.

// catch 블록을 비워두면 예외가 무시된다. 아주 의심스러운 코드다! try{ ... } catch (SomeException e){ } 예외는 문제 상황에 잘 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 물론 예외를 무시해야 할 때도 있다. 예를 들어 FileInputStream을 닫을 때가 그렇다. 파일의 상태를 변경하지 않았으니 복구 할 것이 없으며, 필요한 정보는 이미 다 읽었다는 뜻이니 남은 작업을 중단할 이유도 없다. 어쨌든 예외를 무시하고 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 이름도 ignored로 바꿔놓도록 하자. 참고 자료 Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, ..

Java 2023.04.12

[Effective Java] 아이템 76. 가능한 한 실패 원자적으로 만들라.

🎯 아이템 76. 가능한 한 실패 원자적으로 만들라. 일반화해 이야기하면, 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 메서드를 실패 원자적으로 만드는 방법 1️⃣ 불변 객체 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문이다. 클래스를 불변으로 만들기 위한 5가지 규칙 1.객체의 상태를 변경하는 메서드(setter)를 제공하지 않는다. 2.클래스를 확장할 수 없도록 한다. 3.모든 필드를 final로 선언한다. 4.모든 필드를 private으로 선언한다. 5.자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 2️⃣ 매개변수의 유효성 검사 객체의 내부 상태를 변경하기 전에 잠재적 예외의 가능성 대부분을 걸러낼 수 있는 방법이다. public ..

Java 2023.04.06

[Effective Java] 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라.

🎯 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라. @Override public Object invoke(Object target, Object... parameters) { try { return ( (Method) getMember() ).invoke( target, parameters ); } catch (NullPointerException e) { throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e ); } catch (IllegalArgumentException e) { throw new IllegalArgumentException( "Invoking " + getName() +..

Java 2023.04.05
728x90
반응형