본문 바로가기
Java

자바 싱글턴 테스트

by NaHyungMin 2020. 7. 6.
package util;

public class Singleton2 {
    private Singleton2() {}

    public static MySqlManager getInstance(){
        return LazyHolder.manager;
    }

    private static class LazyHolder{
        private static final MyClass manager = new MyClass();
    }
}

원래 목적은 Thead Safe 클래스를 만드려고 했다.

 

좋아. .Net과 동일하게 Lazy 싱글턴을 만들었으니, 이제 제네릭화 시켜야지! 했는데....

자바 제네릭은 T 타입이 Static에선 정의할 수 없다고 한다.

 

그래서 내 나름대로 변경해서 했는데.. 성능이 좋진 못할거 같은 코드. -..-

 

package util;

public class Singleton{
    private volatile static Object instance;
    private Singleton(){}

    public static <T> T getInstance(Class<T> cls){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null) {
                    try {
                        instance = cls.newInstance();
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        return cls.cast(instance);
    }
}

 

자바를 다시 본지 3일? 정도 밖에 되지 않아 인지부조화가 온다.

 

  @GetMapping(value = "/helloworld/string")
    @ResponseBody
    public String helloworldString() {
        MyClass my = Singleton.getInstance(MyClass.class);
        my.Test = 1;
        System.out.println(my.Test);

        MyClass obj2 = Singleton.getInstance(MyClass.class);
        obj2.Test = 2;
        System.out.println(obj2.Test);

        return "helloworld";
    }

 

테스트 해보니, 제대로 동작하긴 한다.

 

원래 짜려고 했던 닷넷 컨버팅 모드.

 public class LazySingleton<T> where T : new()
    {
        private static readonly Lazy<T> instance = new Lazy<T>(() => new T(), System.Threading.LazyThreadSafetyMode.PublicationOnly);

        public static T Instance { get { return instance.Value; } }

        private LazySingleton() { }
    }

 

'Java' 카테고리의 다른 글

자바 Rest api2  (0) 2020.07.16
자바 Rest api  (0) 2020.07.06
인텔리제이 톰캣 연결  (0) 2020.07.01
인텔리제이 스프링부트 오류  (0) 2020.07.01
인텔리제이 세팅  (0) 2020.07.01