아이템 79. 과도한 동기화는 피하라. 외계인 메서드는 클래스 외부에서 제공된 함수 객체 같은 것을 의미한다. 동기화 블록에서는 외계인 메서드, 재정의 가능한 메서드를 호출하면 안된다. 만약 호출하면 Deadlock, 안전 실패가 발생할 수 있음. 반드시 외계인 메서드, 재정의 가능한 메서드는 동기화 블록 밖에서 호출해야함. 동기화 블록을 사용할 때의 규칙 동기화 영역에서 가능한 일을 적게 한다. 다른 스레드는 동기화 영역의 락을 얻기 위해 대기할 것이다. (낭비) 동기화 영역에서 외계인 메서드를 호출하지 않는다. 외계인 메서드는 어떤 상태를 변경할지 모른다. (안전 실패, 데드락) 외계인 메서드는 얼마나 걸릴지 모른다. (낭비) 동기화에 필요한 비용은? 동기화가 초래하는 진짜 비용은 락을 얻는데 드는 ..
아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라. 동기화를 처리해야할 경우, 라이브러리를 사용해라. 동기화도 되고 성능도 빠르다. 동기화를 하면 다음이 좋음. 원자적으로 실행함. 한 쓰레드의 변경사항을 다른 쓰레드가 볼 수 있도록 보장해 줌. 컴파일러의 자바 최적화 기법에 의한 코드 변경에서 안전할 수 있음. Synchronized는 다음을 보장함. 원자적 실행 보장. 한 쓰레드의 변경사항을 다른 쓰레드가 볼 수 있도록 보장해 줌. 컴파일러의 자바 최적화 기법에 의한 코드 변경에서 안전할 수 있음. volatile은 다음을 보장함. 한 쓰레드의 변경사항을 다른 쓰레드가 볼 수 있도록 보장해 줌. 컴파일러의 자바 최적화 기법에 의한 코드 변경에서 안전할 수 있음. Synchronized의 특성 블..
아이템 77. 예외를 무시하지 말라 메서드를 사용할 때, 메서드 시그니쳐에 선언된 예외는 절대로 무시하면 안됨. (반드시 처리해야한다는 것을 의도한 것임) 만약 무시해도 괜찮은 예외라면, 예외 이름을 Ignore로 바꾸고 이유를 Catch 절에 주석으로 작성해야 함. 메서드 시그니쳐의 예외 → 무시하지 마. API 설계자가 메서드를 설계할 때, 시그니쳐에 예외를 명시하는 이유는 이 API를 사용하는 사람들이 그 예외에 대한 조치를 취해달라고 요청하는 것이다. 따라서 예외가 시그니쳐에 명시된 메서드를 사용할 때는 반드시 예외에 대한 적절한 조치를 해야한다. // Catch 블록을 비워두면 예외가 무시된다. try { ... } catch (SomeException e) { } catch로 예외를 잡은 후,..
아이템 69. 예외는 진짜 예외 상황에만 사용하라. 예외는 진짜 예외 상황에서만 사용해야함. 예외를 잘못 사용한 예시 흐름제어에 예외를 사용함 → 흐름제어에 사용된 예외 때문에 진짜 예외가 무시되어 디버깅이 어려워 질 수 있음. 예외 대신 흐름제어에 사용할만한 것 Optional 상태 검사 메서드 특정 값 중 하나 선택 선택 기준 Optional이나 특정값 사용 상태 검사 메서드 - 상태 메서드 사이에 동시성 문제가 있을 수 있는 경우 성능이 중요한데, 상태 검사 메서드 / 상태 메서드가 중복된 작업이 일부 있는 경우 나머지 경우 상태 검사 메서드 사용하는 것이 유리. 예외를 잘못 사용한 경우. 아래 코드는 무엇을 의미하는 것일까? 단순히 코드만 봤을 때는 무엇을 하는지 전혀 알 수 없다. // 아래 코..
Method 10 100 1000 1,000,000 10,000,000 100,000,000 simpleFunctionWithoutLock 1ms 1ms 2ms 37ms 1.6s 20.9s simpleFunctionWithLock 0ms 0ms 1ms 20ms 0.7s 21.3s simpleFunctionWithLockSleep 106ms 1040ms 109700ms - - - Method 10 100 1,000 10,000 100,000 1,000,000 10,000,000 100,000,000 putWithoutLock 1ms 1ms 3ms 9ms 34ms 217ms 2085ms 23558ms putWithLock 1ms 1ms 2ms 7ms 28ms 172ms 920ms 20060ms Method ..