교착상태와 데이터 훼손을 피하려면 동기화 영역 안에서 외계인 메서드를 절대 호출하지 말자. 🧶 과도한 동기화는 피하라 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 심지어 예측할 수 없는 동작을 낳기도 한다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안 된다. 예를 들어 동기화된 영역 안에서는 재정의할 수 있는 메서드를 호출하면 안 되며, 클라이언트가 넘겨준 함수 객체를 호출해서도 안된다. 동기화된 영역을 포함한 클래스 관점에서는 이런 메서드는 모두 바깥세상에서 온 외계인으로 느끼므로, 그 메서드가 무슨 일을 할지 알지 못하며 통제도 할 수 없다. 👻 외계인 메서드 (alien method) 외계인 메서드가 하는 일에 따라 동기..
가변 데이터를 공유하지 말자. 그럼에도 여러 스레드가 가변 데이터를 공유해야 한다면 그 데이터를 읽고 쓰는 동작은 반드시 동기화해야 한다. 📚 동기화 synchronized 키워드는 해당 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장한다. 한 객체가 일관된 상태를 가지고 생성되고, 이 객체에 접근하는 메서드는 그 객체에 락(lock)을 건다. 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정한다. 즉, 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다. 또한 동기화에는 중요한 기능이 하나 더 있다. 동기화는 일관성이 깨진 상태를 볼 수 없게 하는 것은 물론, 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해 준다. 자바 언어..
예외를 적절히 처리하면 오류를 완전히 피할 수도 있다. 무시하지 않고 바깥으로 전파되게만 놔둬도 최소한 디버깅 정보를 남긴 채 프로그램이 신속히 중단되게는 할 수 있다. 📢 catch문을 비워두지 말아라 API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 그 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. 따라서, 예외는 문제 상황에 대처하기 위해 존재하는데 catch 블록을 비워두면 예외가 존재할 이유가 없어진다. 예를 들면, 화재경보가 났는데 이 것을 꺼버려 다른 사람들이 화재경보를 못 듣는 경우와 같다. 물론 FileInputStream을 닫을 때 처럼 예외를 무시해야 할 때도 있지만, 예외를 무시하기로 했다면 catch 블록 안에 그렇게 결정한 이유를 주석으로 남기고 예외 변수의 ..
예외가 발생해도 객체가 여전히 정상적으로 사용할 수 있는 상태라면 검사 예외를 던진 경우, 호출자가 오류 상태를 복구할 수 있다. 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 이러한 특성을 실패 원자적(failure-atomic)이라고 하는데, 실패 원자적 특성을 활용하면 작업 도중 예외가 발생해도 그 객체는 여전히 정상적으로 사용할 수 있는 상태이고, 검사 예외를 던진 경우에 호출자가 오류 상태를 복구할 수 있으니 매우 유용하다. 💡 메서드를 실패 원자적으로 만드는 다양한 방법 첫 번째, 불변 객체로 설계한다. (가장 간단한 방법) 불변 객체는 태생적으로 실패 원자적이다. 메서드가 실패하면 새로운 객체가 만들어지지 않을 수 있으나 기존 객체가 불안정한 상태에 빠지는 ..
- Total
- Today
- Yesterday
- dp
- 이펙티브자바
- BFS
- 완탐
- Container
- 아이템60
- 운영체제
- Retrofit2
- 아이템61
- 조합
- 백준
- OS
- cicd
- DevOps
- 토큰기반인증
- EffectiveJava
- 알고리즘
- bruteforce
- docker-compose
- springboot
- 순열
- docker
- 아이템59
- BOJ
- subset
- 그래프탐색
- IMAGE
- 완전탐색
- dfs
- Java
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |