메모리 측면
최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.
데이터 공유 측면
다른클래스 간에 데이터 공유가 쉽다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다.
하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이 점을 유의해서 설계해야한다.
<동시성 문제>
한 줄의 프로그램 문장이 컴파일러에 의해 기계어로 변경되면서, 이를 기계가 순차적으로 처리하기 위한 여러개의 Machine Instruction이 만들어져 실행되기 때문에 일어나는 현상
프로그램 언어적으로 i++ 문장은 다음과 같이 기계가 수행하는 명령어로 쪼개진다.
1. i를 메모리로부터 읽는다.
2. 읽은 값에 1을 더한다.
3. 연산한 값을 메모리에 저장한다.
결과적으로 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이다.
싱글톤 패턴은 단독으로 사용한다면 객체지향에 위반되는 사례가 많다.
스프링 컨테이너 같은 프레임워크의 도음을 받으면 싱클톤패턴의 문제점들을 보완하면서 장점의 혜택을 누릴 수 있다.
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://steady-coding.tistory.com/554