[λμμΈ ν¨ν΄] μμ± ν¨ν΄ - μ±κΈν€ ν¨ν΄
by rlaehddnd0422μ±κΈν€ ν¨ν΄μ΄λ?
- νλμ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ μ¬λ¬κ°μ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μμ§λ§, κ·Έλ κ² νμ§ μκ³ νλμ μΈμ€ν΄μ€λ§ λ§λ€μ΄ μ¬μ©νλ ν¨ν΄.
- μΌλ°μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€ μ°κ²° λͺ¨λμμ μ¬μ©νλ€κ³ 보면 λκ² μ.
μ±κΈν€ ν¨ν΄ μ¬μ© μ΄μ
- λ°μ΄ν°λ² μ΄μ 컀λ₯μ νκ³Ό κ°μ΄ νλμ μΈμ€ν΄μ€λ§ λ§λ€μ΄ λκ³ μ΄ μΈμ€ν΄μ€λ₯Ό μ¬νμ©νμ¬ νμλ‘ νλ μμ λ€μ μνν μ μλ κ²½μ°μ κ°μ΄, μΈμ€ν΄μ€λ₯Ό λΆνμνκ² μ¬λ¬κ° λ§λ€ νμκ° μμ λ μ±κΈν€μΌλ‘ κ΄λ¦¬νμ¬ λΆνμν μμ μ¬μ©μ λ§κΈ° μν΄.
μ±κΈν€ ν¨ν΄ μμ± λ°©λ²
0. κΈ°λ³Έμ μΈ λ°©μ
- μ±κΈν€ ν¨ν΄μ μ μ©νκΈ° μν΄μλ λ κ° μ΄μμ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μ λ§μμΌ νκΈ° λλ¬Έμ μ°μ μ μΌλ‘ κ°μ²΄ μμ±μ μν new ν€μλμ μ μ½μ‘°κ±΄μ κ±Έμ΄μ€μΌ νκ³ , λ§λ€μ΄μ§ λ¨μΌ κ°μ²΄λ₯Ό λ°νν μ μλ λ©μλκ° νμν©λλ€.
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // True
}
static class Singleton {
private static final Singleton INSTANCE; // static μμμ 미리 νλ λ§λ€μ΄ λμ ν, κ°μ²΄ μμ±μ getIntance()λ‘ νΈμΆνμ¬, νμ κ°μ μΈμ€ν΄μ€λ₯Ό 리ν΄νλλ‘ μ€μ
public static Singleton getInstance() {
if(INTANCE == null) {
INSTANCE = new SingleTon();
}
return Singleton.INSTANCE;
}
// μμ±μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μ λ§μμ£ΌκΈ°
private Singleton{}(
// λ΄λΆμ μΌλ‘ νΈμΆνλ κ²½μ° μμΈλ₯Ό λμ Έ λ΄λΆμμλ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€μ§ λͺ»νλλ‘ μ€μ .
throw new AssertionError();
)
}
}
- νμ§λ§ μ΄ λ°©μμ κ²½μ° Thread Safe νμ§ μλ€λ μΉλͺ μ μΈ λ¨μ μ΄ μμ.
public static Singleton getInstance() {
// Thread Aμ Thread Bμμ λμμ getInstance()λ₯Ό νΈμΆνκ² λλ©΄ if 쑰건λΆκΈ°λ¬Έμ΄ Aμ Bμμ λͺ¨λ ν΅κ³Όνλ κ²½μ° SingleTonμ΄ κΉ¨μ§κ² λ¨.
if(INTANCE == null) {
INSTANCE = new SingleTon();
}
return Singleton.INSTANCE;
}
- μ μ½λμμ μ¬λ¬ μ€λ λκ° λμμ getInstance()λ₯Ό λμμ νΈμΆνλ κ²½μ° Singleton μΈμ€ν΄μ€κ° λ κ° μμ±λμ΄ μ±κΈν€ ν¨ν΄μ΄ κΉ¨μ§ μ°λ €κ° μμ.
Thread Safeν μ±κΈν€ ν¨ν΄ ꡬν λ°©λ²μ λν΄ μμλ΄ μλ€.
1. static + μ€μ²©ν΄λμ€(νλ) λ°©μ
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton SINGLETON_OBJECT = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.SINGLETON_OBJECT;
}
}
- μ ν리μΌμ΄μ λΉ λ¨ νλ + SingletonHoderλ₯Ό μ€μ μ¬μ©ν λκΉμ§ μ΄κΈ°νλ₯Ό λ―Έλ£Έ.
- JVMμ ν΄λμ€ λ‘λμ μν΄ λ‘λλ λ λ΄λΆμ μΌλ‘ μ€νλμ΄ μμ±λ¨.
- μ μ μ΄κΈ°νλ‘ μμ±λλ―λ‘ Thread Safeνλ€λ μ₯μ .
- Thread Safe : μ¬λ¬ μ€λ λμμ getInstance()λ₯Ό νΈμΆν΄λ λ¨ νλμ μΈμ€ν΄μ€λ§ 리ν΄.
2. Eager init λ°©μ
public class Singleton {
private static final Singleton SINGLETON_OBJECT = new Singleton();
private Singleton() {
}
public static synchronized Singleton getInstance() {
return SINGLETON_OBJECT;
}
}
- 미리 static μμμ μ±κΈν€ μΈμ€ν΄μ€λ₯Ό μμ±ν΄λλ λ°©μ.
- λ§μ½ μμ± λΉμ©μ΄ ν¬κ³ , μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ§ μλλ€λ©΄ λ©λͺ¨λ¦¬ λλΉμ μ°λ €κ° μμ.
- μΆκ°λ‘ μμ±κ³Ό λμμ final ν€μλλ₯Ό ν΅ν΄ λΆλ³μ±μ 보μ₯ν΄μ€ μ μμ.
3. Synchronized lazy init λ°©μ
static class Singleton {
private static Singleton singletonObject;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (singletonObject == null) {
singletonObject = new Singleton();
}
return singletonObject;
}
}
- λ¨μν synchronized ν€μλλ₯Ό μ¬μ©νμ¬ getInstance() λ©μλμ νλμ μ€λ λλ§μ΄ μ κ·Όν μ μλλ‘ νκ² νλ λ°©λ².
- μ¬λ¬ μ€λ λκ° λμμ μ κ·Όνκ² λλ©΄ λκΈ°ν μμ μ΄ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ μ±λ₯μ ν λ°μν μ μμ.
4. double check locking λ°©μ
- volatile ν€μλμ λλΈ μ²΄ν¬λ₯Ό ν΅ν synchronized ν€μλλ₯Ό νμ©νμ¬ μ΄κΈ°ν ν λλ§ λκΈ°ν μμ μ μννλ λ°©λ².
volatile
keywordλ Java λ³μλ₯Ό Main Memoryμ μ μ₯νκ² λ€λΌλ κ²μ λͺ μνλ ν€μλ- μμ synchronized lazy init λ°©μ μ²λΌ getInstance()λ₯Ό νΈμΆν λλ§λ€ λκΈ°ν μμ μ 걸리λ κ²μ΄ μλλΌ, "μ΅μ΄" μ΄κΈ°ν μμλ§ λκΈ°ν μμ μν.
- JVM λ²μ μ΄ 1.5 μ΄μμΈ κ²½μ°μλ§ μ μ© κ°λ₯
public class Singleton {
// volatile ν€μλ μ¬μ©
private static volatile Singleton singletonObject;
private Singleton() {
}
public static Singleton getInstance() {
if (singletonObject == null) {
// if λ¬Έ μ§μ
μμλ§ Singleton ν΄λμ€μ λν λκΈ°ν μμ
μν
synchronized (Singleton.class) {
if (singletonObject == null) {
singletonObject = new Singleton();
}
}
}
return singletonObject;
}
}
5. Enum λ°©μ
- enum νμ μΌλ‘ μ±κΈν€μ μ μ©νλ λ°©λ².
- ν¨μ¬ κ°κ²°νκ² μ¬μ© κ°λ₯νλ©°, Serialize λλ Reflection 곡격μμλ μ±κΈν€μ΄ κΉ¨μ§λ κ²μ μλ²½ν λ§μ μ μμ.
- λ§λλ €λ μ±κΈν€μ΄ enumμΈμ ν΄λμ€λ₯Ό μμν΄μΌ νλ€λ©΄ μ΄ λ°©λ²μ μ¬μ©ν μ μμ΅λλ€. (λ€λ§, enum Singleton implements ~μ κ°μ΄ μΈν°νμ΄μ€λ ꡬννλλ‘ μ μΈν μλ μμ)
public enum Singleton {
INSTANCE;
}
<μ°Έκ³ μλ£>
'π CS > Design-Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λμμΈ ν¨ν΄] μμ± ν¨ν΄ - ν©ν 리 λ©μλ ν¨ν΄ (0) | 2024.06.03 |
---|
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422