Singleton 패턴은 프로그램 내에서 하나의 클래스에 대해 하나의 인스턴스만 존재하도록 보장하는 패턴입니다.

public class Singleton {
private static Singleton instance;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
private 로 선언static 으로 선언되어, 객체가 없어도 호출 가능static 변수가 필요함public class Main {
public static void main(String[] args) {
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 == obj2) {
System.out.println("obj1 == obj2");
} else {
System.out.println("obj1 != obj2");
}
}
}
Singleton.getInstance() 가 실행될 때 생성된다.멀티스레드 환경에서 동시에 여러 스레드가 getInstance() 를 호출하면, 여러개의 인스턴스가 생성되는 문제가 생길 수 있습니다. 객체를 생성하는 블록에 synchronized 키워드를 걸어 하나의 스레드만 접근할 수 있도록 하면 문제를 해결할 수 있습니다.
Singleton.getInstance() 가 실행될 때 생성됨public class Singleton {
private static volatile Singleton instance;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
synchronized 키워드로 객체 생성하는 코드 블록을 동기화하여, 한 번에 하나의 스레드만 그 코드 블록을 실행할 수 있도록 함volatile 키워드를 사용해 다른 스레드가 instance == null 을 체크할 때 정확한 최신 값을 읽을 수 있게 함