일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- 스프링 공부
- nestjs공부
- JPA스터디
- Flutter
- 기술면접공부
- querydsl
- JPA
- DDD
- 스프링부트공부
- nestjs
- JPA예제
- 스프링부트
- 자료구조공부
- JPA 공부
- 코테준비
- 스프링공부
- 플러터 공부
- K8S
- 플러터 개발
- Axon framework
- 자바공부
- 기술공부
- nestjs스터디
- Kafka
- 코테공부
- JPA공부
- 알고리즘공부
- 카프카
- 스프링
- Today
- Total
DevBoi
[Java] singleTon 디자인 패턴 본문
싱글턴 패턴이란
-전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조 할 수 있도록 하는 패턴
하나의 인스턴스만 생성하여, 모든 클라이언트들에게 동일한 인스턴스를 반환한다.
생성자를 private으로 하고, 클라이언트에서는 해당 생성된 인스턴스를 사용하여 처리한다.
<문제점>
다중 스레드에서 Printer클래스를 이용할때 인스턴스 1개 이상 생성되는 경우가 발생할 수 있다.
경합 조건에서 두개의 쓰레드가 null을 체크후에 진행이 된다면, 동시에 두개의 인스턴스가 생성이 될 수도 있다.
<해결 방법>
1) static 변수로 인스턴스를 만들어서, 초기화 하는 방법
static 변수
객체가 생성되기 전 클래스가 메모리에 로딩될때 만들어져서 초기화가 한번만 실행된다.
메소드 영역에 메모리가 상주하게 되고, 해당 영역에 저장된 메모리는 모든 스레드에서 공통으로 참조가 가능하다.
2) 인스턴스를 만드는 메서드에 동기화 하는 방법
인스턴스를 만드는 메서드를 임계영역으로 설정한다.
synchronized를 통해, 한개의 스레드만 접근 할수있도록 한다.
Lock을 하는 방식이라 속도가 느리다.
2) 정적 클래스를 사용하는 경우
정적 메서드로만 이루어진 정적 클래스를 사용하면 싱글턴과 동일한 효과를 얻을수 있다.
정적 메서드를 사용하면, 일반적으로 실행할때 바인딩 되는 인스턴스 메서드를 사용하는 것보다 성능 면에서 우수하다.
정적 클래스를 이용하면, 객체를 전혀 생성하지 않고 메서드를 사용할 수 있다.
주의점 : 정적 메서드는 인터페이스에서 사용불가하다
3.Enum 클래스
1. 쓰레드 세입과 직렬화가 보장된다.
2.Reflection을 통한 공격에도 안전하다.
3.싱글톤 구현의 가장 좋은 예다.
'Language > [Java]' 카테고리의 다른 글
[Java] lombok의 setter/getter 메소드 생성 시점문의 (0) | 2022.03.30 |
---|---|
[Java] Enum 클래스 (0) | 2022.03.29 |
[Java] Reflection 개념 및 사용법 (0) | 2022.03.29 |
[Java] LinkedList (0) | 2022.03.29 |
[Java] Vetor 개념 및 사용 방법 (0) | 2022.03.29 |