์ธ์คํด์ค ์์ฑํ ๋ ์ด๋ป๊ฒ ํ ๊น? --------> new MyClass();
๋ง์ฝ ์์ฑ์๊ฐ private์ผ๋ก ์ ์ธ๋ผ์์ผ๋ฉด? --------> ์ธ์คํด์ค ์์ฑ ๋ถ๊ฐ.
์์ฑํ๊ฒ ํ๋ ค๋ฉด?? --> ์ธ์คํด์ค๋ณ์๋ฅผ static๋ณ์๋ก ๋ฏธ๋ฆฌ ์ ์ธํ --> ์์ฒญ์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ง๋ค์ด์
๋๊ฒจ์ฃผ๋ ์์ผ๋ก ์์ฑํด์ค๋ค.
public class Singleton{
private static Singleton uniqueInstance;
private Singleton() { } // private๋ก ์ ์ธ๋ ์์ฑ์
public static Singleton getInstance() { //์ธ์คํด์ค ์์ฑํ๋ ๋ฉ์๋
if (uniqueInstance == null) { //์ธ์คํด์ค๊ฐ ์์ฑ๋ ์ ์ด ์๋์ง ํ์ธํ
uniqueInstance = new Singleton(); //์์ฑ
}
return uniqueInstance; //return
}
}
์ฑ๊ธํด ํจํด ์ ์ ) ์ฑ๊ธํด ํจํด์ ํด๋น ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ๋ง๋ค์ด์ง๊ณ ,
์ด๋์๋ ์ง ๊ทธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํ ํจํด์ ๋๋ค.
์ฑ๊ธํด ํจํด : ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ฑ๊ธํด ํจํด์ ๋ฌธ์ ์
ChocolateBoiler boiler = new ChocolateBoiler.getInstance();
fill();
boil();
drain();
Thread1 | Thread2 | uniqueInstance |
public static Chocolate getInstance() | null | |
public static Chocolate getInstance() | null | |
if(uniqueInstance == null)
|
if(uniqueInstance == null) *์์ข์ ์ํฉ |
null null |
uniqueInstance = new ChocolateBoiler(); return uniqueInstance;
|
uniqueInstance = new ChocolateBoiler();
return uniqueInstance; |
<object1> <object1>
<object2> ** ๋ฌธ์ ๋ฐ์! <object2> ** ๋ฌธ์ ๋ฐ์!
|
๋ฉํฐ์ค๋ ๋ฉ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. synchronized ๋๊ธฐํ ์ํค๊ธฐ.
public class Singleton{
private static Singleton uniqueInstance;
//๊ธฐํ ์ธ์คํด์ค ๋ณ์
private Singleton() {}
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
....
}
๋จ์ ) ์์ฒญ๋ ์๋ ์ ํ ( ๋๊ธฐํ ์ํค๋ฉด ์ฑ๋ฅ์ด 100๋ฐฐ ์ ๋ ์ ํ )
2. ์ฒ์๋ถํฐ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฒ๋ฆฌ๊ธฐ.
public class Singleton{
public static Singleton uniqueInstance = new Singleton(); //!!
private Singleton(){ }
public static Singleton getInstance(){
return uniqueInstance;
}
}