ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디자인 패턴 - 싱글톤
    공부 2022. 7. 27. 11:22
    728x90

    실무에서 주로 사용되는 디자인 패턴: 빌더, 팩토리 메서드, 싱글턴, 어댑터, 브릿지, 퍼사드, 옵저버, 템플릿 메서드

     

    싱글턴: 객체를 하나만 존재할 수 있게 만든다. 객체가 여러개 생성되면, 메모리 낭비가 심해 객체를 하나만 생성하게 한다.

    스프링에서는 하나의 객체만 생성할 수 있게 한다.

     

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

    위와 같이 생성시 객체 1개밖에 생성 못함

    new를 사용시 클래스와 이름이 같은 생성자를 호출한다.

    private를 사용시 클래스 안에서만 생성자 접근이 가능하다. 다른 곳에서 new를 통해 생성이 안되고, getInstance() 메소드를 통해 생성 가능하다.

     

    싱글톤 호출

    public class SingletonTest {
        public static void main(String[] args) {
            //new Sigleton(); // 불가
            System.out.println(Singleton.getInstance());
            System.out.println(Singleton.getInstance());
            System.out.println(Singleton.getInstance());
            System.out.println(Singleton.getInstance());
            System.out.println(Singleton.getInstance());
            System.out.println(Singleton.getInstance());
        }
    }
     

     

    동일한 객체 호출

     

    public class SingletonTest {
        public static void main(String[] args) {
            //new Sigleton(); // 불가
            for(int i=0;i<5;i++){
                Thread singlethonThread=new Thread(new SigletonThread());
                singlethonThread.start();
            }
        }
    }
    class SigletonThread implements Runnable{
        public void run(){
            System.out.println(Singleton.getInstance());
        }
    }

    위와 같이 실행시 동일한 객체가 생성이 안됨

     

    public class Singleton {
        private static Singleton instance=null;
        private Singleton(){ }
        public synchronized static Singleton getInstance() {
            if(instance==null){
                instance=new Singleton();
            }
            return instance;
        }
    }
    위와 같이 수정 후 동일한 객체가 생성됨
     

    쓰레드 환경에서는 동시성에 문제가 있기 때문에 신경써줘야 한다.

    하지만 위와 같이 진행하면 속도 저하가 일어남

     


    public class Singleton {
        //thread-safe: 함수 또는 변수 또는 객체가 여러 스레드로부터 동시에 접근이 이루어져도 동시에 이루어지지 않을 때와 차이가 없는 것을 의미
        private Singleton(){ }
        public static Singleton getInstance(){
            return LazyHolder.INSTANCE;
        }
        private static class LazyHolder{
            private static final Singleton INSTANCE = new Singleton();
        }
    }

    위와 같이 수정

    쓰레드를 만들 때 thread-safe하게 만들어 줘야 된다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형

    '공부' 카테고리의 다른 글

    서버 통신  (0) 2022.07.28
    서버 클라이언트 통신  (0) 2022.07.27
    자바 쓰레드  (0) 2022.07.27
    네트워크 스트림  (0) 2022.07.26
    자바 스트림  (0) 2022.07.26

    댓글

Designed by Tistory.