JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[Effective Java] Item 83. 지연 초기화로 인한 초기화 순환성의 영향 #45

Closed taxol1203 closed 3 years ago

taxol1203 commented 3 years ago

443p, 첫 문단에서 지연 초기화가 초기화 순환성을 깨뜨리는 것을 방지하기 위해 synchronized를 단 접근자를 사용하라고 되어있습니다.

초기화 순환성이란, A클래스의 생성자가 B의 인스턴스를 생성하고 -> B클래스의 생성자가 C의 인스턴스를 생성하고 -> C클래스의 생성자가 A의 인스턴스를 생성하는 경우를 뜻한다고 합니다.

[ initialization circularity ] Class A in its constructor creates instance of class B, class B creates instance of class C, and class C creates instance of class A.

  1. 지연 초기화가 어떻게 초기화 순환성을 깨뜨리는지
  2. 깨뜨림으로 인해서 어떤 문제가 일어나는지가 잘 이해가 되지 않네요,, 혹시 어떻게 이해하셨는지 여쭤봅니다
daebalprime commented 3 years ago

이해를 잘못한 부분이 있어 다시 작성합니다. 만약 A->B->C->A 구조로 초기화 순환성이 존재할 경우 A 객체를 하나만 만들어도 stack overflow가 발생할 것입니다. 이를 깨뜨리기 위해 각 클래스에 lazy initialization을 적용할 경우 해당 객체가 사용될 때에만 초기화를 진행하니 stack overflow가 발생하지 않을 것이기 때문에 lazy evaluation을 사용합니다.

원문은 If you use lazy initialization to break an initialization circularity, use a synchronized accessor 과 같이 되어 있습니다.

그러나 지연 초기화 자체가 멀티쓰레드 환경에서 문제를 일으킬 수 있기 때문에 (2개의 쓰레드가 동시에 해당 필드에 접근할 경우 초기화 2번 수행) synchronized를 적용하라는 의미이지, 초기화 순환성을 깨뜨리기 위한 지연초기화에 synchronize를 적용하라는 의미는 아닌 것 같습니다.

초기화 순환성은 왜 코드 저렇게 짜는지 이해가 안됩니다.....