싱글톤 디자인 패턴은 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 패턴이다. 여기서는 자바에서 싱글톤 패턴을 구현하는 7가지 대표적인 방법을 살펴본다.
싱글톤 패턴 생성 여부를 확인하고 싱글톤이 없으면 새로 만들고 있다면 만들어진 인스턴스를 반환한다.
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
java코드를 예시로 다시 살펴보자.
thread1.java 코드예시
public class YunhaSync {
private static String yunha = "비밀번호486";
// YunhaSync코드의 메인메서드 시작
public static void main(String[] agrs) {
YunhaSync a = new YunhaSync(); // 인스턴스 생성
// 쓰레드 시작
new Thread(() -> {
for (int i = 0; i < 10; i++) {
a.say("사건의 지평선");
}
}).start();
// 쓰레드 시작
new Thread(() -> {
for (int i = 0; i < 10; i++) {
a.say("비밀번호486");
}
}).start();
}
// say메서드 시작
public void say(String song) {
yunha = song;
try {
long sleep = (long) (Math.random() * 100); Thread.sleep(sleep);
}catch (InterruptedException e) {
e.printStackTrace();
}
if (!yunha.equals(song)) {
System.out.println(song + " | " + yunha);
}
}
}
결과
쓰레드로 인해 인스턴스가 1개 이상 생성되어 메서드가 실행되는 것을 볼 수 있다.
thread2.java 코드 (
synchronized
를 사용)
public class YunhaSync {
private static String yunha = "비밀번호486";
public static void main(String[] agrs) {
YunhaSync a = new YunhaSync();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
a.say("사건의 지평선");
}
}).start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
a.say("비밀번호486");
}
}).start();
}
public synchronized void say(String song) {
yunha = song;
try {
long sleep = (long) (Math.random() * 100);
Thread.sleep(sleep);
}catch (InterruptedException e) {
e.printStackTrace();
}
if (!yunha.equals(song)) {
System.out.println(song + " | " + yunha);
}
}
}
synchronized
사용 결과