= 객체의 인스턴스를 한개만 생성되게 하는 패턴sw디자인 패턴에서 싱글턴 패턴을 따르는 클래스는 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴
package kail.study.java.design.single;
public class Printer {
private static Printer printer = null;
private Printer(){}
public static Printer getInstance() {
if(printer == null) {
printer = new Printer();
}
return printer;
}
public void print(String input) {
System.out.println(input);
}
}
메모리
측면속도
측면데이터 공유
측면Multi-Thread 환경에서 안전성
문제 발생
여러 쓰레드가 공유되고 있는상황에서 조건문이 동시에 두번 돌 수 있는데 이때 하나의 인스턴스가 아닌 여러개의 인스턴스 발생가능
public static Printer getInstance() {
if(printer == null) {
printer = new Printer();
}
return printer;
}
서로 다른 프로세스에서 처리할 경우 값의 일관성
에 문제 발생
public class Printer {
private static Printer printer = null;
private int count = 0;
private Printer(){}
public static Printer getInstance() {
if(printer == null) {
printer = new Printer();
}
return printer;
}
public void print(String input) {
count++;
System.out.println(input + "count : "+ count);
}
}
정적 변수에 인스턴스를 만들어 바로 초기화
하는 방법
: 정적 변수는 객체가 생성되기 전(= 클래스가 메모리에에 로딩할 때) 만들어져 초기화가 한번만 실행되며 프로그램 종료시까지 없어지지않기 때문에 클래스에서 생성된 모든 객체에서 참조 가능
synchronized
키워드 사용해서 여러 스레드에서 동시 접근을 막는다package kail.study.java.design.single;
public class Printer {
private static Printer printer = new Printer();
private static int count = 0;
private Printer(){}
public static Printer getInstance() {
return printer;
}
public synchronized static void print(String input) {
count++;
System.out.println(input + "count : "+ count);
}
}
메서드에 동기화
하는 방법 : 인터페이스의 경우 정적 메서드를 가질 수 없어서 정적 클래스를 사용할 수 없다멀티 쓰레드 환경
에서의 싱글톤단일쓰레드환경
에서 싱글톤