본문 바로가기

자바

[자바] 싱글톤이 보장받지 않는 상황

package com.devjones.web.singleton;

public class Singleton {
	private static Singleton instance = null;
	
	private Singleton() {};
	
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

 

위와 같은 싱글톤 객체가 있을 때 다음과 같은 코드로 싱글톤이 멀티쓰레드 환경에서 단일객체를 보장받을수 없음을 보일 수 있다.

 

package com.devjones.web.singleton;

public class Main extends Thread {
	public static void main(String[] args) {
		new Main().start();
		new Main().start();
		new Main().start();
		new Main().start();
	}
	
	@Override
	public void run() {
		Singleton obj = Singleton.getInstance();
		System.out.println(getName() + ": obj = " + obj);
	}
}

 

결과:

Thread-0: obj = com.devjones.web.singleton.Singleton@60b044c
Thread-2: obj = com.devjones.web.singleton.Singleton@45f6223b
Thread-3: obj = com.devjones.web.singleton.Singleton@60b044c
Thread-1: obj = com.devjones.web.singleton.Singleton@45f6223b

 

물론 위 메인메소드를 여러번 돌려보면 객체가 같을 수도 있고 다를 수도 있다.

 

확실히 저마다 다른 인스턴스를 생성하려면...

 

package com.devjones.web.singleton;

public class Singleton {
	private static Singleton instance = null;
	
	private Singleton() {
		slowdown();
		System.out.println("싱글톤 객체 생성");
	}
	
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
	
	private void slowdown() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

getInstance 메소드에 synchronized키워드를 붙여 해결하자.

'자바' 카테고리의 다른 글

[자바] composite 패턴  (0) 2021.06.06
[자바] Observer 패턴  (0) 2021.06.03
[자바] builder 패턴  (0) 2021.06.03
[자바] 장식자 패턴  (0) 2021.06.03
List의 중복제거, HashSet  (1) 2021.05.24