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 |