Item 83. Lazy Initialization
์ง์ฐ ์ด๊ธฐํ๋ ์ ์คํ ์ฌ์ฉํ๋ผ
์ผ๋ฐ์ ์ผ๋ก ํ๋๋ฅผ ์ด๊ธฐํ ํ ๋ ์๋์ ๊ฐ์ด ์ด๊ธฐํ๋ฅผ ํ๋ค.
class Init {
private final FieldType field = computeFieldValue();
}
ํ์ง๋ง ์ด๊ธฐํ ์์ ์ ์ฒ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ํ์ํ ์์ ์ ํ๋ ์ง์ฐ ์ด๊ธฐํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ๋ค๋ฅธ ์ต์ ํ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ง์ฐ ์ด๊ธฐํ๋ ๋ชจ๋ ์ํฉ์์ ์ฑ๋ฅ์ ํฅ์์ํค์ง ์์ผ๋ฉฐ, ์คํ๋ ค ์ฑ๋ฅ์ ์ ํ์ํฌ ์๋ ์๋ค. ์ง์ฐ ์ด๊ธฐํ๋ ๋ณดํต ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
ํ๋์ ์ด๊ธฐํ ๋น์ฉ์ด ๋์ ๊ฒฝ์ฐ ์ต์ ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ
์ด๊ธฐํ ์ํ์ฑ(Initialization circularity) ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด๊ธฐํ ์ํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด synchornized
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
class LazyInit {
private FieldType field;
private synchronized FieldType getField() {
if (field == null) {
field = computeFieldValue();
}
return field;
}
}
์ฑ๋ฅ ๋ฌธ์ ๋ก ์ธํ ์ง์ฐ ์ด๊ธฐํ(์ ์ ํ๋)
๋ง์ฝ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ ์ ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํด์ผํ๋ ๊ฒฝ์ฐ์ ์ง์ฐ ์ด๊ธฐํ ํ๋ ํด๋์ค ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํด๋์ค๋ ํด๋์ค๊ฐ ์ฒ์ ์ฐ์ผ ๋ ์ด๊ธฐํ๋๋ ํน์ฑ์ ์ด์ฉํ์ฌ ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
class LazyInit {
private static class FieldHolder {
static final FieldType field = computeFieldValue();
}
private static FieldType getField() {
return FieldHolder.field;
}
}
getField
๋ฉ์๋๊ฐ ์ฒ์ ํธ์ถ๋ ๋ FieldHolder
ํด๋์ค๊ฐ ์ด๊ธฐํ๋๋ฉฐ, ๋ด๋ถ์ field
ํ๋๊ฐ ์ด๊ธฐํ๋๋ค.
์ด ๋ฐฉ์์ ๋๊ธฐํ ์์ด๋ ์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ํํ ์ ์์ด, ์ฑ๋ฅ์ด ์ ํ๋ ์์ธ์ด ์ ํ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ฑ๋ฅ ๋ฌธ์ ๋ก ์ธํ ์ง์ฐ ์ด๊ธฐํ(์ธ์คํด์ค ํ๋)
์ธ์คํด์ค ํ๋์ ๊ฒฝ์ฐ์ ์ด์ค๊ฒ์ฌ ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํด ์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ํํ ์ ์๋ค. ์ด ๋ฐฉ์์ ํ ๋ฒ ์ด๊ธฐํ๋ ํ๋์ ์ ๊ทผํ ๋ ๋๊ธฐํ ๋น์ฉ์ ์์ ์ฃผ๋ ๋ฐฉ์์ด๋ค.
class LazyInit {
private volatile FieldType field;
private FieldType getField() {
FieldType result = field; // ์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํด ํ๋๋ฅผ ํ ๋ฒ๋ง ์ฝ๋๋ก ๋ณด์ฅ
if (result != null) { // ์ฒซ ๋ฒ์งธ ๊ฒ์ฌ: ๋ฝ ์์ด ์ํ
return result; // null์ด ์๋๋ฉด ์ด๋ฏธ ์ด๊ธฐํ๋ ์ํ์ด๋ฏ๋ก ๋ฐํ
}
synchronized (this) { // ๋ ๋ฒ์งธ ๊ฒ์ฌ: ๋ฝ์ ๊ฑธ๊ณ ์ํ
if (field == null) { // ํ๋๊ฐ ์์ง ์ด๊ธฐํ๋์ง ์์๋ค๋ฉด
field = computeFieldValue(); // ํ๋๋ฅผ ์ด๊ธฐํ
}
return field; // ํ๋๋ฅผ ๋ฐํ
}
}
}
volatile
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๋ฅผ ์ ์ธํ์ฌ, ํ๋์ ๋ํ ๋ชจ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ด์ค๊ฒ์ฌ ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
์ด ๋ฐฉ์์ ์ ์ ํ๋์๋ ์ฌ์ฉํ ์ ์์ง๋ง, ๊ตณ์ด ๊ทธ๋ด ํ์ ์์ด ์ ์ ํ๋์ ๊ฒฝ์ฐ์ ์ง์ฐ ์ด๊ธฐํ ํ๋ ํด๋์ค ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข๋ค.
Last updated
Was this helpful?