싱글 톤 모드 구현
해법 1 (좋 지 않 습 니 다. 단일 스 레 드 환경 에 만 적 용 됩 니 다)
public class Singleton {
private Singleton {}
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
여기에 쓰 인 것 은 전형 적 인 게으름뱅이 식 단 례 이 고 굶 주 린 한식 의 단 례 모델 도 있 는데 아래 에서 소개 할 것 이다.이런 표기 법 이 좋 지 않 은 이 유 는 다 중 스 레 드 환경 에서 사용 할 수 없 기 때문이다.생각해 보 세 요. 이때 두 개의 스 레 드 가 있 습 니 다. 스 레 드 1 과 스 레 드 2. 그 중에서 스 레 드 1 이
if (instance == null)
라 는 문 구 를 실 행 했 습 니 다. 이때 스 레 드 2 가 집행 권 을 빼 앗 고 계속 실행 하면 스 레 드 1 도 계속 기 다 려 야 합 니 다.스 레 드 2 가 실 행 된 후에 Singleton 대상 을 되 돌려 준 후에 스 레 드 1 은 instance = new Singleton();
이 문 구 를 시작 으로 실 행 됩 니 다. 그래서 스 레 드 2 에서 대상 을 만 든 후에 스 레 드 1 도 대상 을 만 들 었 습 니 다.따라서 한 대상 만 만 들 겠 다 는 요 구 는 여기 서 이 루어 질 수 없다.해법 2 (다 중 스 레 드 환경 에서 일 할 수 있 지만 효율 이 높 지 않다)
해법 1 의 실 패 는 주로 다 중 스 레 드 의 상황 을 고려 하지 않 았 기 때문에 이런 상황 에 대한 가장 직접적인 해결 방법 은 문제 가 발생 할 수 있 는 곳 에 동기 코드 를 추가 하 는 것 이 빠르다 는 것 이다.
public class Singleton {
private Singleton {}
private static Singleton instance = null;
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
현재 이 코드 는 다 중 스 레 드 의 경우 유일한 인 스 턴 스 만 만 만 들 수 있 고 우리 가 해법 1 에서 만난 문 제 를 성공 적 으로 해결 할 수 있 습 니 다.그러나 잠 금 은 프로그램 에 시간 이 많이 걸 리 는 작업 이다.그리고 우 리 는 이 코드 에서 어떤 상황 에서 든 하나의 스 레 드 가 싱글 톤 대상 을 만 들 려 고 할 때 마지막 잠 금 이 필요 하 다 는 것 을 알 게 되 었 다.프로그램의 운영 효율 을 크게 떨 어 뜨 렸 기 때문에 개선 이 필요 하 다.
해법 3 (동기 잠 금 전후 두 번 추가 하여 인 스 턴 스 가 이미 존재 하 는 지 판단)
해법 2 중 코드 에 대한 분석 을 통 해 알 수 있 듯 이 실제 다음 코드 는 인 스 턴 스 가 만 들 지 않 았 을 때 만 실행 하면 된다.
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
따라서 인 스 턴 스 가 생 성 된 상황 에서 특정한 스 레 드 가 인 스 턴 스 를 가 져 오 려 고 할 때 이 동기 코드 블록 을 실행 하 는 것 을 피하 기 위해 우 리 는 알 고 있 습 니 다.
public class Singleton {
private Singleton {}
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
위의 이 코드 는 해법 2 의 동기 코드 블록 외 에 인 스 턴 스 가 이미 존재 하 는 지 에 대한 판단 을 추가 했다.이러한 방법 을 통 해 인 스 턴 스 가 생 성 된 상황 에서 모든 스 레 드 는 실행 과정 에서 동기 화 코드 를 실행 하지 않 기 때문에 해법 2 를 바탕 으로 프로그램의 운행 효율 을 크게 향상 시 켰 다.
해법 4 (굶 주 린 한식 해결 라인 문제)
해법 3 은 충분 해 보이 지만 코드 내용 이 길다.그렇다면 동기 화하 지 않 고 다 중 스 레 드 상황 에서 단일 모델 을 실현 할 수 있 는 방법 은 없 을 까?굶 주 린 한식 단일 모델 이 바로 이 문제 의 답안 이다.
public class Singleton {
private Singleton() {}
private static Singleton instance = new Singleton;
public static Singleton getInstance() {
return instance;
}
}
굶 주 린 한식 단일 사례 모델 은 위의 세 가지 해법 이 둘러싸 인 라인 안전 문 제 를 교묘 하 게 피 했다.그러나 주의해 야 할 것 은 인 스 턴 스
instance
는 첫 번 째 호출 Singleton.getInstance()
때 만 든 것 이 아니 라 프로그램 에서 처음 사용 Singleton
할 때 만 든 것 이다.만약 에 우리 가 위의 코드 에 단일 요구 와 무관 한 정적 함 수 를 삽입 한다 고 가정 하면 우리 가 이 정적 함 수 를 사용 할 때 Singleton
인 스 턴 스 를 만 들 지 않 았 지만 굶 주 린 한 식 단일 예 는 우리 에 게 너무 일찍 인 스 턴 스 를 만들어 메모리 의 사용 효율 을 낮 출 것 이다.해법 5 (필요 에 따라 인 스 턴 스 생 성 실현)
해법 4 에 대하 여 이곳 의 해법 5 는 이 문 제 를 잘 해결 하 였 다.
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return Nested.instance;
}
private static class Nested {
static Singleton instance = new Singleton();
}
}
이 코드 에서 우 리 는
Singleton
에서 개인 유형 Nested
을 정 의 했 는데 이 유형 은 호출 Singleton.getInstance()
할 때 만 호출 된다.우 리 는 Nested
유형 을 private
유형 으로 정의 하기 때문에 다른 종 류 는 Nested
유형 을 호출 할 수 없습니다.따라서 Singleton 인 스 턴 스 는 그 어떠한 상황 에서 도 우리 가 호출 Singleton.getInstance()
할 때 만 만들어 집 니 다. 최종 적 으로 법 4 중의 미리 인 스 턴 스 를 만 드 는 문 제 를 잘 해결 하고 필요 에 따라 만 들 었 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.