싱글턴 패턴 - 객체가 생성되고 나면 어디서든지 다시 생성없이 사용 할 수 있도록 하는 패턴
1. static으로 자신 클래스 형의 전역변수를 만들고 getInstance() 메서드로 객체를 얻어서 사용한다
2. 멀티쓰레드 일 경우 동시에 접근해서 여러번 생성되지 않도록 동기화 시킨다 
| 첫번째 방법 | 
| package singleton1; public class Singleton { | 
특징 : getInstance() 의 동기화 synchronized 를 통해 한번에 한 사용자만 접근해서 객체를 생성 및 반환받는다 public class Singleton {
장점 : 객체를 처음부터 생성하지 않고 필요한 순간 생성 할 수 있다.
단점 : 매번 호출할때마다 null 비교 후 객체를 얻게 되고 동시에 많은 접근이 있을 경우 메서드의 동기화로 대기시간이 길어진다.
 
 두번째 방법 
 
 
package singleton2; 
    private static Singleton uniqueInstance = new Singleton();
    public Singleton() {
    }
    public static Singleton getInstance() {
        return uniqueInstance;
    }
}
특징 : 시작부터 객체를 생성해버린다. public class Singleton {
장점 : 매번 생성되어 있는지 확인을 할 필요가 없다. 동기화로 인한 속도 저하도 없다
단점 : 객체가 무겁다면 처음부터 생성되어 있으므로 부담을 줄수도 있다
 
 세번째 방법 
 
 
package singleton3;
    private volatile static Singleton uniqueInstance;
    public Singleton() {
    }
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
특징 : DCL (double checking locking) 을 써서 동기화를 줄여준다. volatile 사용
       * volatile 키워드를 사용하면 멀티스레딩을 쓰더라도 uniqueInstance 변수가
          Singleton 인스턴스로 초기화 되는 과정이 올바르게 진행되도록 할 수 있습니다
장점 : 생성 부분만 동기화를 시켜서 대기시간을 줄여준다
단점 : 자바 1.4 및 이전 버젼에서는 volatile 키워드를 사용하더라도 동기화가 잘 안되는 것이 많다 고 한다
