14 Aug 2023 EffectiveJava
직렬화의 도입
1997년, 자바에 처음으로 직렬화가 도입되었다. 처음엔 다소 위험하다는 이야기가 나왔지만, 프로그래머가 어렵지 않게 분산 객체를 만들 수 있다는 구호는 매력적이었고, 지지자들은 장점이 위험성을 압도한다고 생각했다.
직렬화의 위험성
보안 문제는 실제로도 우려한 만큼 심각한 것으로 밝혀졌다. 2000년대 초반에 논의된 취약점들이 그 후로...
14 Aug 2023 EffectiveJava
여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다.
정상적인 운영체제라면 이 작업을 공정하게 수행하지만 구체적인 스케줄링 정책은 운영체제마다 다를 수 있다.
정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다.
이식성 좋은 프로그램 작성법
견고하고 빠릿하고 이식성...
12 Aug 2023 EffectiveJava
지연초기화(lazy initialization)
필드의 초기화 시점을 그 값이 처음 필요할때까지 늦추는 기법. 정적 필드와 인스턴스 필드 모두에 사용할 수 있다.
그래서 지연초기화를 하는 값이 전혀 쓰이지 않으면 초기화도 결코 일어나지 않는다. 지연초기화는 주로 최적화 용도로 쓰이지만, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환...
02 Aug 2023 EffectiveJava
API문서에서 아무런 언급도 없으면 그 클래스 사용자는 나름의 가정을 해야만 한다.
만약 그 가정이 틀리면 클라이언트 프로그램은 동기화를 충분히 하지 못하거나 지나치게 한 상태이며, 두 경우 모두 심각한 오류로 이어질 수 있다.
스레드 안정성 문서화
API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다는...
01 Aug 2023 EffectiveJava
wait와 notify는 Object 객체의 메서드로 스레드를 제어하는 기능이다.
wait() : wait()을 호출하면 현 스레드의 객체의 lock을 풀고 대기상태에 들어가면서 제어권을 다른 쓰레드에게 양보하게 됩니다. synchronized 블럭 내에서만 호출이 가능하며, 객체에 락이 걸려있지 않을 경우 에러를 발생합니다.
notify() : 대기하고 있는 스레드중 임의의...