티스토리 뷰

Database.java

public class Database {
	private static Database singleton;
	private String name;

	private Database(String name) {
		try {
			// 실제 데이터베이스 접속 환경과 비슷하게 시간이 걸리도록 처리
			Thread.sleep(100);
			this.name = name;
		}catch(Exception e) {
			
		}
	}
	
	public static Database getInstance(String name) {
		// 최초에는 singleton이 null이므로 singleton이 생성됨
		// 최초 생성 이후에는 singleton이 null이 아니므로 singleton이 
		if(singleton == null) {
			singleton = new Database(name);
		}
		return singleton;
	}
	public String getName() {
		return name;
	}
	
}

TestPattern2.java

public class TestPattern2 {

	static int nNum = 0;
	
	public static void main(String[] args) {
		Runnable task = () -> {
			try {
				nNum++;
				Database database = Database.getInstance(nNum+"번째 Database");
				System.out.println("This is the "+database.getName()+" !!");
			}catch(Exception e) {
				
			}
		};
		
		for(int i = 0 ; i < 10; i++) {
			Thread t = new Thread(task);
			t.start();
		}
	}
	
}

결과

  • 결함
    • 싱글턴 패턴을 적용할 때 빠르게 실행되는 for문 안에 있는 코드안에서 객체를 생성하는 경우 매우 빠르게 실행되므로 Database 클래스의 getInstance 에서는 singleton 이 null인 것으로 인식하여 중복하여 10개가 생성됨
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함