Assembled by Anna (2019-11-27)
- Singleton Pattern μ κ°λ μ μ μ μλ€.
- Singleton Pattern μ λμμ리λ₯Ό μ΄ν΄ν μ μλ€.
- Multi-thread νκ²½μμμ Singleton Patternμ μ΄ν΄ν μ μλ€.
Creating one-of-a-kind objects for which there is only one instance
λ¨ νλμ κ°μ²΄
λ₯Ό μμ±νκ³ μμ±λ κ°μ²΄λ₯Ό μ΄λμλ μ°Έμ‘°ν μ μλλ‘ νλ ν¨ν΄μ
λλ€.
μ¬κΈ°μ μ£Όμν μ μ ν΄λμ€λ₯Ό staticμΌλ‘ μ μΈνλ κ²μ΄ μλ, λμ μΌλ‘ μμ±νκ³ heap μμμμ GCλ‘ κ΄λ¦¬λλλ‘ νλ, λ¨ νλμ κ°μ²΄λ₯Ό μμ±νλ κ²μ λλ€.
Singletonμ κ°λ¨ν ꡬννλ©΄ λ€μκ³Ό κ°μ΄ λνλΌ μ μμ΅λλ€.
public class Singleton {
private static Singleton instance; // 2
private Singleton() {} // 1
public static Singleton getInstance() // 3
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
-
μμ±μ
μμ±μλ₯Ό
private
μ§μ μλ₯Ό μ¬μ©νμ¬ μΈλΆ ν΄λμ€μμ μμ±νμ§ λͺ»νλλ‘ ν©λλ€. -
instance
Singletonμ κ°μ²΄μ λλ€. μΈλΆ ν΄λμ€μμλ ν΄λΉ κ°μ²΄λ₯Ό μ¬μ©νκ² λ©λλ€. λ§μ°¬κ°μ§λ‘
private
μ§μ μλ₯Ό μ¬μ©νμ¬ μΈλΆ ν΄λμ€μμ μ§μ μ μΌλ‘ μ κ·Όνμ§ λͺ»νκ² ν©λλ€. -
getInstance()
μΈλΆμ λͺ¨λ ν΄λμ€μμ νΈμΆνμ¬ Singleton κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€.
- νΈμΆμ νκ²λλ©΄, λ¨Όμ κ°μ²΄κ° μμ±λμλ μ§λ₯Ό νλ³ν©λλ€.
- μμ±λμ§ μμλ€λ©΄, instanceμ Singleton κ°μ²΄λ₯Ό μμ±νμ¬ λ£μ΄μ€λλ€.
- instanceλ₯Ό λ°νν©λλ€.
μΈλΆ ν΄λμ€μμ λ€μκ³Ό κ°μ΄ Singleton κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€.
public class AnotherClass {
void usingSingleton() {
Singleton inst = Singleton.getInstance();
}
}
λ§μ½, Multi-thread νκ²½μμ λ κ° μ΄μμ μ€λ λκ° getInstance() ν¨μμ μ§μ νλ€κ³ ν λ λ κ° μ΄μμ κ°μ²΄κ° μμ±λ μ μμ΅λλ€.
-
미리 μΈμ€ν΄μ€λ₯Ό μμ±νλ λ°©λ².
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() return instance; } }
미리 μΈμ€ν΄μ€λ₯Ό μμ±νκ² λλ©΄, λΆνμν μμ€ν 리μμ€λ₯Ό λλΉνκ² λ μλ μμ΅λλ€.
-
synchronized
λ₯Ό μ¬μ©νλ λ°©λ².public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static Singleton getInstance() if(instance == null) { instance = new Singleton(); } return instance; } }
getInstance() λ©μλλ₯Ό λκΈ°ννλ λ°©λ²μΌλ‘, λκΈ°νλ‘ μΈν΄ μν μκ°μ΄ λλ €μ§λ€λ λ¨μ μ΄ μμ΅λλ€.
-
λ΄λΆ
static
ν΄λμ€λ₯Ό μ¬μ©νλ λ°©λ².public class Singleton { private Singleton() {} public static Singleton getInstance() { return LazyHolder.INSTANCE; } // LazyHolder κΈ°λ² μ¬μ©. private static class LazyHolder { private static final Singleton INSTANCE = new Singleton(); } }
LazyHolder
ν΄λμ€λgetInstance()
κ° νΈμΆλλ μκ° Classκ° λ‘λ©λλ©°, μ΄ μκ°μ thread-safe κ° λ³΄μ₯λκΈ° λλ¬Έμ,syncronized
λvolatile
λ₯Ό μ¬μ©νμ§ μκ³ λ μμ νκ² μ¬μ©κ°λ₯ν©λλ€.
- https://jungwoon.github.io/java/2019/08/11/Singleton-Pattern-with-Multi-Thread/
- HeadFirstDesignPattern