item 83 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์ง์ฐ ์ด๊ธฐํ(lazy initialization)๋?
ํ๋์ ์ด๊ธฐํ ์์ ์ ๊ทธ ๊ฐ์ด ์ฒ์ ํ์ํ ๋๊น์ง ๋ฆ์ถ๋ ๊ธฐ๋ฒ.
์ง์ฐ ์ด๊ธฐํ๋ ์๋ ์ ๊ฒ์ด๋ค. ์ต๋ํ ์ด ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค(item67)
์ธ์คํด์ค ์์ฑ ์์ ์ด๊ธฐํ ๋น์ฉ์ ์ค์ง๋ง, ๋์ ์ง์ฐ ์ด๊ธฐํํ๋ ํ๋์ ์ ๊ทผํ๋ ๋น์ฉ์ ์ปค์ง๊ธฐ ๋๋ฌธ.
ํ์ง๋ง ํด๋์ค์ ์ธ์คํด์ค ์ค ๊ทธ ํ๋๋ฅผ ์ฌ์ฉํ๋ ์ธ์คํด์ค์ ๋น์จ์ด ๋ฎ์ ๋ฐ๋ฉด,
๊ทธ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด ์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ฐ ์ด๊ธฐํํ๋ ํ๋๋ฅผ ๋ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ค๋ฉด,
์ด๋ค ํํ๋ก๋ ๋ฐ๋์ ๋๊ธฐํํด์ผ ํ๋ค. (item78)
๋ฐฉ์ 1. ์ธ์คํด์ค ํ๋์ ์ง์ฐ ์ด๊ธฐํ - synchronized ์ ๊ทผ์ ๋ฐฉ์
์ง์ฐ ์ด๊ธฐํ๊ฐ ์ด๊ธฐํ ์ํ์ฑ(initialization circularity)์ ๊นจ๋จ๋ฆด ๊ฒ ๊ฐ์ผ๋ฉด
synchronized๋ฅผ ๋จ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์. ์๋ ์ฝ๋๋ ์ ์ ํ๋์๋ ๋๊ฐ์ด ์ฌ์ฉ๊ฐ๋ฅํ๋ค
private FieldType field;
private synchronized FieldType getField() {
if(field == null){
field = computerFieldValue();
}
return field;
}
๋ฐฉ์ 2. ์ ์ ํ๋์ฉ ์ง์ฐ ์ด๊ธฐํ ํ๋ ํด๋์ค ๊ด์ฉ๊ตฌ
์ฑ๋ฅ ๋๋ฌธ์ ์ ์ ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํด์ผ ํ๋ค๋ฉด
์ง์ฐ ์ด๊ธฐํ ํ๋ ํด๋์ค(lazy initialization holder class) ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ์
ํด๋์ค๋ ํด๋์ค๊ฐ ์ฒ์ ์ฐ์ผ ๋ ๋น๋ก์ ์ด๊ธฐํ๋๋ค๋ ํน์ฑ์ ์ด์ฉํ ๊ด์ฉ๊ตฌ๋ค.
private static class FieldHolder {
static final FieldType field = computeFieldValue();
}
private static FieldType getField() {
return FieldHolder.field;
}
getField๊ฐ ์ฒ์ ํธ์ถ๋๋ ์๊ฐ FieldHolder.field๊ฐ ์ฒ์ ์ฝํ๋ฉด์
๋น๋ก์ FieldHolder ํด๋์ค ์ด๊ธฐํ๋ฅผ ์ด๋ฐํ๋ค.
์ด ๊ด์ฉ๊ตฌ์ ๋ฉ์ง ์ ์ getField ๋ฉ์๋๊ฐ ํ๋์ ์ ๊ทผํ๋ฉด์ ๋๊ธฐํ๋ฅผ ์ ํ ํ์ง ์์ผ๋
์ฑ๋ฅ์ด ๋๋ ค์ง์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ VM์ ์ค์ง ํด๋์ค๋ฅผ ์ด๊ธฐํํ ๋๋ง
ํ๋ ์ ๊ทผ์ ๋๊ธฐํํ ๊ฒ์ด๋ค. ํด๋์ค ์ด๊ธฐํ๊ฐ ๋๋ ํ์๋ VM์ด ๋๊ธฐํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ,
๊ทธ ๋ค์๋ถํฐ๋ ์๋ฌด๋ฐ ๊ฒ์ฌ๋ ๋๊ธฐํ ์์ด ํ๋์ ์ ๊ทผํ๊ฒ ๋๋ค.
๋ฐฉ์ 3. ์ธ์คํด์ค ํ๋์ฉ ์ง์ฐ ์ด๊ธฐํ ์ด์ค๊ฒ์ฌ ๊ด์ฉ๊ตฌ
์ฑ๋ฅ ๋๋ฌธ์ ์ธ์คํด์ค ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํด์ผ ํ๋ค๋ฉด ์ด์ค๊ฒ์ฌ(double-check) ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ผ.
private volatile FieldType field;
private FieldType getField() {
FieldType result = field;
if (result != null) {
return result;
}
synchronized (this) {
if (field == null) {
field = coputeFieldValue();
}
return field;
}
}
์ด ๊ด์ฉ๊ตฌ๋ ์ด๊ธฐํ๋ ํ๋์ ์ ๊ทผํ ๋์ ๋๊ธฐํ ๋น์ฉ์ ์์ ์ค๋ค (item79)
๊ทธ๋ฆฌ๊ณ ํ๋์ ๊ฐ์ ๋๋ฒ ๊ฒ์ฌํ๋ ๋ฐฉ์์ธ๋ฐ, ํ ๋ฒ์ ๋๊ธฐํ ์์ด ๊ฒ์ฌํ๊ณ
(ํ๋๊ฐ ์์ง ์ด๊ธฐํ๋์ง ์์๋ค๋ฉด) ๋ ๋ฒ์งธ๋ ๋๊ธฐํํ์ฌ ๊ฒ์ฌํ๋ค.
ํ๋๊ฐ ์ด๊ธฐํ๋ ํ๋ก๋ ๋๊ธฐํํ์ง ์์ผ๋ฏ๋ก ํด๋น ํ๋๋ ๋ฐ๋์ volatile๋ก ์ ์ธํด์ผ ํ๋ค. (item78)