DEV ℧ Developer Diary

[EffectiveJava] item85 - 자바 직렬화의 대안을 찾으라

직렬화의 도입

1997년, 자바에 처음으로 직렬화가 도입되었다. 처음엔 다소 위험하다는 이야기가 나왔지만, 프로그래머가 어렵지 않게 분산 객체를 만들 수 있다는 구호는 매력적이었고, 지지자들은 장점이 위험성을 압도한다고 생각했다.

직렬화의 위험성

보안 문제는 실제로도 우려한 만큼 심각한 것으로 밝혀졌다. 2000년대 초반에 논의된 취약점들이 그 후로...

[EffectiveJava] item84 - 프로그램의 동작을 스레드 스케줄러에 기대지 말라

여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다.

정상적인 운영체제라면 이 작업을 공정하게 수행하지만 구체적인 스케줄링 정책은 운영체제마다 다를 수 있다.

정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다.

이식성 좋은 프로그램 작성법

견고하고 빠릿하고 이식성...

[EffectiveJava] item83 - 지연 초기화는 신중히 사용하라

지연초기화(lazy initialization)
필드의 초기화 시점을 그 값이 처음 필요할때까지 늦추는 기법. 정적 필드와 인스턴스 필드 모두에 사용할 수 있다.

그래서 지연초기화를 하는 값이 전혀 쓰이지 않으면 초기화도 결코 일어나지 않는다. 지연초기화는 주로 최적화 용도로 쓰이지만, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환...

[EffectiveJava] item82 - 스레드 안전성 수준을 문서화 하라

API문서에서 아무런 언급도 없으면 그 클래스 사용자는 나름의 가정을 해야만 한다.
만약 그 가정이 틀리면 클라이언트 프로그램은 동기화를 충분히 하지 못하거나 지나치게 한 상태이며, 두 경우 모두 심각한 오류로 이어질 수 있다.

스레드 안정성 문서화

API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다는...

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

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

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

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