[CS지식의 정석] 싱글톤 디자인 패턴 구현하기: 7가지 방법(작성중)

박두팔이·2023년 8월 14일
0

CS컴퓨터과학

목록 보기
9/13

싱글톤 디자인 패턴 구현하기: 7가지 방법

싱글톤 디자인 패턴은 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 패턴이다. 여기서는 자바에서 싱글톤 패턴을 구현하는 7가지 대표적인 방법을 살펴본다.

1. 단순한 메서드 호출

싱글톤 패턴 생성 여부를 확인하고 싱글톤이 없으면 새로 만들고 있다면 만들어진 인스턴스를 반환한다.

  • 아래의 코드는 getInstance를 호출해 instance가 없다면(null) Singleton 인스턴스를 생성하라는 코드이다.
public class Singleton {
 	private static Singleton instance;
  
  	private Singleton() {
  	}

	public static Singleton getInstance() { 
    	if (instance == null) {
			instance = new Singleton(); 
        }
		return instance;
    }
}
  • 그러나 메서드의 원자성(CPU 가 처리하는 하나의 단일 연산)이 결여되어 있어 멀티스레드 환경에서 싱글톤 인스턴스가 2개이상 만들어질 가능성이 있다.

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 사용 결과

profile
기억을 위한 기록 :>

0개의 댓글