-
0. λ€μ΄κ°λ©°μ΄λ² μμ΄ν
μ μ±κΈν΄ ν¨ν΄μ μμ μ μΌλ‘ ꡬννκΈ° μν λ°©λ²λ€μ λν λ΄μ©μ
λλ€. 1. μ±κΈν΄μ΄λ?
'μ€μ§ νλλ§ μμ±ν μ μλ€' λΌλ λ§μ 'μΈμ€ν΄μ€κ° νλλ§ μ‘΄μ¬ν΄μΌ νλ€' λΌκ³ ν΄μν μλ μμ΅λλ€. 1.1 μ±κΈν΄μ νΉμ§1. λ©λͺ¨λ¦¬ μ μ½λͺ¨λ κ°μ²΄λ μμ±λλ©΄ JVM μ heap λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€. 2. λ°μ΄ν° 곡μμ±κΈν€μΌλ‘ ꡬνλ κ°μ²΄λ JVM heap μ μ μ₯λ νλμ κ°μ²΄λ₯Ό λͺ¨λ ν΄λΌμ΄μΈνΈλ€μ΄ 곡μ νκ² λλλ°μ. 3. λ©ν°μ€λ λ νκ²½μ κ³ λ €ν΄μΌ ν¨λ€μμ ν΄λΌμ΄μΈνΈμμ νλμ κ°μ²΄, μ¦ νλμ μμμ 곡μ νλ μν©μ΄λ€ 보λ μμΉ«νλ©΄ μΉλͺ
μ μΈ λ¬Έμ κ° λ°μν μ μμ΅λλ€. 4. μ±κΈν΄μ μ¬μ©νλ ν΄λΌμ΄μΈνΈλ₯Ό ν μ€νΈνκΈ° μ΄λ €μν
μ€νΈ μΌμ΄μ€λ€μ μμ±ν λ νμ°μ μΌλ‘ λ€μν μ
λ ₯κ°, μΆλ ₯κ°μ μ μν΄μΌ ν©λλ€. μ΄λ° λΆλΆμ λ°©μ§νκ³ μ νλ€λ©΄ μ±κΈν€ ν΄λμ€κ° νΉμ μΈν°νμ΄μ€λ₯Ό μμνκ² νλ λ°©λ²μ΄ μμ΅λλ€. interface Something {
void doSomething();
}
class SingletonSomething implements Something {
@Override
public void doSomething() {
// do something
}
}2. μ±κΈν΄μ ꡬννλ λ°©λ²
1,2,3λ² λ°©μμ Effective java μμ μ μνλ λ°©μμ΄κ³ , 4λ²μ μΆκ°λ‘ μκ°νκ³ μΆμ λ°©λ²μ
λλ€. 2.1 public static final νλ/**
* 1. public static final νλ λ°©μ
*/
public class Singleton1 {
public static final Singleton1 instance = new Singleton1();
private Singleton1() { }
}
2.2 μ μ ν©ν°λ¦¬ λ°©μμ μ ν©ν°λ¦¬ λ°©μμμλ μ¬λ¬κ°μ§ λ°©λ²μ μ¬μ©ν μ μμ΅λλ€.
1) static final νλ νμ©/**
* 2. μ μ ν©ν°λ¦¬ λ°©μ
* 1) static final νλ νμ©
*/
public class Singleton2_1 {
private static final Singleton2_1 instance = new Singleton2_1();
private Singleton2_1() { }
public static Singleton2_1 getInstance() {
return instance;
}
}2.1 κ³Ό νΉμ§μ΄ κ°μ΅λλ€.
2) Lazy Initialization(μ§μ° μ΄κΈ°ν)/**
* 2. μ μ ν©ν°λ¦¬ λ°©μ
* 2) Lazy Initialization(μ§μ° μ΄κΈ°ν)
*/
public class Singleton2_2 {
private static Singleton2_2 instance;
private Singleton2_2() { }
public static Singleton2_2 getInstance() {
if (instance == null) {
instance = new Singleton2_2();
}
return instance;
}
}1)λ² λ°©λ²μ μ¬μ©νμ§ μμλ λΆνμνκ² κ°μ²΄κ° μμ±λλ€λ λ¨μ μ΄ μμμ΅λλ€.
3) Lazy Initialization + Synchronization(μ§μ° μ΄κΈ°ν + λκΈ°ν)/**
* 2. μ μ ν©ν°λ¦¬ λ°©μ
* 3) Lazy Initialization + Synchronization(μ§μ° μ΄κΈ°ν + λκΈ°ν)
*/
public class Singleton2_3 {
private static Singleton2_3 instance;
private Singleton2_3() { }
public static synchronized Singleton2_3 getInstance() {
if (instance == null) {
instance = new Singleton2_3();
}
return instance;
}
}λ©ν°μ€λ λ νκ²½μμ λ μ΄μ€ 컨λμ
μ΄ λ°μνλ κ²½μ°λ₯Ό λ°©μ§νκΈ° μν΄ λκΈ°νλ₯Ό μ¬μ©νλ λ°©λ²μ
λλ€.
4) LazyHolder λ°©μ/**
* 4. LazyHolder λ°©μ
*/
public class Singleton4 {
private Singleton4() { }
private static class LazyHolder {
private static final Singleton4 INSTANCE = new Singleton4();
}
public static Singleton4 getInstance() {
return LazyHolder.INSTANCE;
}
}LazyHolder λ°©μμ μ§μ° μ΄κΈ°ν λ°©μμ μ±λ₯μ λ¬Έμ λ₯Ό κ°μ νκΈ° μν΄ μ μλ λ°©λ²μ
λλ€.
3. μ‘°κΈ λ μκ°ν΄λ³Ό κ²λ€
|
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 1 reply
-
μ€,, μ΄ λ°©μμ μ²μ 보λλ°,, μ΄λ° λ°©μλ μκ΅°μ,, π΅ |
Beta Was this translation helpful? Give feedback.
-
|
μ±κΈν΄μ λ§λ€λ 3) Lazy Initialization + Synchronization(μ§μ° μ΄κΈ°ν + λκΈ°ν) λ°©μμΌλ‘ λ©ν°μ€λ λ©μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©ν synchronizedλ‘ μΈν μ±λ₯μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μΌλ‘
public class Singleton3 {
private volatile static Singleton3 uniqueInstance;
private Singleton3() {}
public static Singleton3 getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton3.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton3();
}
}
}
return uniqueInstance;
}
}
μ΄λ² μμ΄ν μ ν΅ν΄ μ±κΈν΄μ λ§λλ μ¬λ¬ λ°©λ²μ λν΄ μκ² λμκ³ μ±κΈν΄μ λ§λ€κ² λ¨μΌλ‘μ¨ μκΈ°λ λ¬Έμ μ μ ν΄κ²°νκΈ° μν΄ κ° λ°©μμ΄ μ겨λκ² λ μ΄μ λ μκ² λμμ΅λλ€. μ 리 κ°μ¬ν©λλ€. |
Beta Was this translation helpful? Give feedback.
-
|
μ 리 ν΄μ£Όμ κΈ μ μ½μμ΅λλ€ π public class Singleton { // Lazy loading with a holder
private static class SingletonHolder {
static {
System.out.println("In SingletonHolder static block.");
}
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
System.out.println("In getInstance().");
return SingletonHolder.INSTANCE;
}
private Singleton() {
System.out.println("In constructor.");
}
private void doSomething() {
System.out.println("Singleton working.");
}
public static void main(String[] args) {
System.out.println("Start of main.");
Singleton.getInstance().doSomething();
System.out.println("End of main.");
}
}
public class Singleton { // Eager loading without a holder
static {
System.out.println("In Singleton static block.");
}
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
System.out.println("In getInstance().");
return INSTANCE;
}
private Singleton() {
System.out.println("In constructor.");
}
private void doSomething() {
System.out.println("Singleton working.");
}
public static void main(String[] args) {
System.out.println("Start of main.");
Singleton.getInstance().doSomething();
System.out.println("End of main.");
}
}
|
Beta Was this translation helpful? Give feedback.
μ±κΈν΄μ λ§λ€λ 3) Lazy Initialization + Synchronization(μ§μ° μ΄κΈ°ν + λκΈ°ν) λ°©μμΌλ‘ λ©ν°μ€λ λ©μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©ν synchronizedλ‘ μΈν μ±λ₯μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μΌλ‘
4)LazyHolder λ°©μμ μ¬μ© νμλλ° μ λ μ²μ μκ² λμμ΅λλ€.3)λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μΌλ‘4)λ§κ³ λ μκ³ μλ λ΄μ©μΌλ‘λDCL(Double Checked Locking) λ°©μμ λν΄ μκ³ μμ΅λλ€.
3)λ°©μμ λ¬Έμ λ λκΈ°νκ° κΌ νμν μμ μ β¦