자바
[자바] 싱글톤이 보장받지 않는 상황
devjones
2021. 6. 3. 22:14
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키워드를 붙여 해결하자.