์ฑ๊ธํค ํจํด์ด๋?
ํ๋ง๋๋ก ์ ์ํ์๋ฉด '๊ฐ์ฒด๋ฅผ ๋จ ํ๋๋ง ์์ฑํ๋๋ก ํ๋ ๋์์ธ ํจํด'!
static์ด๊ธฐ ๋๋ฌธ์ ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ต์ ์ป์ผ๋ฉฐ, ๋ชจ๋ ํด๋ผ์ด์ธํธ(ํด๋์ค)์์ ํด๋น ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ด์ ๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ๋ค์์ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์์ ์ฃผ๋ก ์ฌ์ฉ ๋๋ค.
์ฑ๊ธํค ํจํด์ ์์ ๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ํํ๊ฐ ๋๋ถ๋ถ์ด๋ค.
๋ณธ์ธ๋ ์ฑ๊ธํค ํด๋์ค๋ฅผ ์์ฑํ ๋ ์ด๋ ๊ฒ ์์ฑํ์๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋๊ฐ ์ด์์ ์ค๋ ๋๊ฐ getInstance()๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ ๋๊ฐ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. (= ๋์์ฑ ๋ฌธ์ , thread unsafe)
public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
ํด๊ฒฐ ๋ฐฉ๋ฒ
1. ์ธ์คํด์ค๋ฅผ ํธ์ถํ ๋ ์์ฑํ์ง ์๊ณ , ์ฒ์๋ถํฐ ์์ฑํ๋ ๋ฐฉ๋ฒ.
์ด๋ฐ ๊ฒฝ์ฐ ๋ถํ์ํ ๊ฒฝ์ฐ์๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฏ๋ก ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋๋ค.
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return new Singleton();
}
}
2. Thread safe Lazy initialization ๋ฐฉ๋ฒ - synchronized
synchronized ํค์๋๋ฅผ ์ฌ์ฉํด์ getInstance() ๋ฉ์๋๋ฅผ ๋๊ธฐํ ์ํด์ผ๋ก์จ thread-safeํ๊ฒ ๋ง๋ค ์ ์๋ค.
ํ์ง๋ง ํฐ ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๊ถ์ฅํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
Double-checked locking์ ํตํด ์ฑ๋ฅ ์ ํ๋ฅผ ์ํ์ํค๋ ๋ฐฉ๋ฒ๋ ์๋ค๋๋ฐ ์๋ฒฝํ ๋ฐฉ๋ฒ์ ์๋๋ผ๊ณ ํ๋ค.
3. Holder initialization ๋ฐฉ๋ฒ - LazyHolder
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก getInstance()๋ฉ์๋์์ LazyHolder.INSTANCE๋ฅผ ํธ์ถํ๋ ์๊ฐ Class๊ฐ ๋ก๋ฉ๋๋ฉฐ ์ด๊ธฐํ๊ฐ ์งํ๋๊ณ , ์ด ์์ ์ thread-safe๋ฅผ ๋ณด์ฅํ๋ค.
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
public static final Singleton INSTANCE = new Singleton();
}
}
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ์๋ค.
์ฐธ๊ณ : https://jeong-pro.tistory.com/86
๋๊ธ