일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 플러터 공부
- querydsl
- Kafka
- 스프링공부
- JPA공부
- 스프링 공부
- 자바공부
- nestjs공부
- 스프링부트
- nestjs스터디
- Flutter
- 코테공부
- K8S
- JPA 공부
- 카프카
- 기술공부
- 플러터 개발
- JPA
- 스프링
- 스프링부트공부
- 알고리즘공부
- 기술면접공부
- Axon framework
- 프로그래머스
- JPA스터디
- 코테준비
- nestjs
- JPA예제
- 자료구조공부
- DDD
- Today
- Total
DevBoi
[Java] 싱글톤 패턴 본문
싱글턴 패턴을 따르는 클래스는 생성자가 여러차례 호출되더라도, 실제로 생성되는 객체는 하나이고
최초 생성 이후에 호출된 생성자는 최초생성자가 생성한 객체를 리턴한다.
장점
-메모리 측면으로 효율적
-생성된 인스턴스를 활용하여 속도 측면에서 좋다
-전역으로 사용되기 때문에 데이터 공유가 쉽다.
단점
- 동시성 문제가 발생할 수 있다.
- 테스트가 어렵다, 자원을 공유하고있기 때문에, 격리된 환경에서 수행하면, 매번 인스턴스의 상태를 초기화 시켜주어야 한다.
- 구체 클래스에 의존적이 된다.
- 자식 클래스를 만들수 없다.
- 내부 상태를 변경하기 어렵다
- 유연성이 많이 떨어진다.
멀티쓰레드에서는 인스턴스가 여러개 생성되거나, 상태유지가 잘안되어 값에 대한 유지를 잘 못할 수도있다.
멀티쓰레드 환경에서 싱글톤의 문제를 해결할 수 있는 방법은 두가지가 있다.
- 정적 변수에 인스턴스를 만들어 바로 초기화 하는 방법
- 인스턴스를 만드는 메서드를 동기화 하는 방법
정적변수는 객체가 생성되기 전 클래스가 메모리에 로딩할때 만들어져 초기화가 한번만 실행된다.
정적 변수는 프로그램이 시작될 때부터 종료될때까지 없어지지 않고, 메모리에 계속 상주하며 클래스에서 생성된 모든 객체를 참조 할 수 있게 해준다.
상태변경이나, 이외 의 메소드에는 동기화 메소드를 써서, 다른 쓰레드의 진입을 막는 방법 또한 존재한다.(내부 상태값, 상태에따른 노출 값 등등)
-> 싱글 톤은 전체에서 하나의 객체만 공통으로 사용하고있기 때문에 객체간의 결합도가 높고, 변경에 유연하게 대처할수 없다.
-> 프로그램 전반적으로가 아닌, 필요한 부분만 사용하는 것이 좋다 (전체적으로 사용하면 관리가 어렵다)
결론
멀티 쓰레드 환경에서 싱글톤은 Syncronized, 단일 쓰레드 환경에서는 정적 클래스 형태로 사용
'Language > [Java]' 카테고리의 다른 글
[Java] 프레임워크와 라이브러리 차이 (0) | 2022.03.15 |
---|---|
[Java] 지역 변수 , 인스턴스 변수, 클래스 변수 (0) | 2022.03.15 |
[Java] 추상클래스 인터페이스 차이 (0) | 2022.03.15 |
[Java] JIT 컴파일러 (0) | 2022.03.15 |
[Java] Java 장단점 (0) | 2022.03.15 |