너 진짜 단일 모드 쓸 줄 알 아?
오늘 소개 해 드 리 겠 습 니 다
. 바로 이 등 판 률 이 매우 높 은 모델 입 니 다. 프로그래머 가 기본적으로 그 를 사용 해 본 적 이 있 고 사용 해 본 적 이 없어 서 적어도 그 를 알 고 있 습 니 다.근 데 우리 진짜 알 아?단일 모델 의 일반적인 실현 방식 은 다음 과 같은 두 가지 로 나 뉜 다.
굶 주 린 사람 식
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
public void doSomething(){
// Do something ...
}
}
는 가장 간단 한 실현 방식 이다. 이런 실현 방식 은 초기 화 할 때 한 가지 예 를 사용 해 야 하 는 상황 에 적합 하 다. 이런 방식 은 간단 하고 거 칠 며 한 가지 예 로 초기 화 되 지 않 으 면 매우 빠 르 고 메모리 가 매우 어 릴 때 이런 방식 이 적당 하 다. 응용 프로그램 이 시 작 될 때 직접 불 러 오고 초기 화 하 는 것 이 적당 하 다.그러나 만약 에 한 번 의 초기 화 작업 이 비교적 오래 걸 리 고 응용 이 시작 속도 에 대한 요구 가 있 거나 한 번 의 점용 메모리 가 비교적 크 거나 한 번 의 사례 가 특정한 장면 에서 만 사용 되 는 경우 가 있 으 며 일반적인 상황 에서 사용 하지 않 을 때
의 단일 모델 을 사용 하 는 것 은 적절 하지 않다. 이 럴 때 사용 해 야 한다
.필요 에 따라 로드 를 지연 시 키 는 방식 입 니 다.게으름뱅이 식
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
public void doSomething(){
// Do something ...
}
}
와
의 가장 큰 차 이 는 하나의 초기 화 작업 을 필요 할 때 까지 지연 시 키 는 것 이다. 이렇게 하 는 것 은 어떤 상황 에서 큰 도움 이 된다.예 를 들 어 특정한 사례 에서 사용 하 는 횟수 가 많 지 않 지만 이 사례 가 제공 하 는 기능 은 매우 복잡 하고 로드 와 초기 화 는 대량의 자원 을 소모 해 야 한다. 이때 사용
하 는 것 이 좋 은 선택 이다.다 중 스 레 드 에서 의 단일 예 모드
위 에서 일부 사례 모델 의 기본 적 인 응용 방법 을 소개 했다. 그러나 위 에서 말 한 사용 방식 은 모두 은밀 한 전제 가 있다. 그것 은 바로 그들 이 모두 단일 스 레 드 조건 에서 다 중 스 레 드 로 바 뀌 면 오류 가 발생 할 위험 이 있다 는 것 이다.다 중 스 레 드 의 경우
문제 가 발생 하지 않 습 니 다. JVM 은 단리 류 를 한 번 만 불 러 올 수 있 지만
단리 대상 을 중복 생 성 하 는 문제 가 발생 할 수 있 습 니 다.왜 이런 문제 가 생 겼 을 까?
단일 예 를 만 들 때 스 레 드 가 안전 하지 않 기 때문에 여러 스 레 드 가 동시에 그의 newInstance
방법 을 호출 할 수 있 기 때문에 여러 스 레 드 가 같은 단일 예 를 만 들 수 있 습 니 다.
의 단리 모델 도 스 레 드 가 안전 하도록 할 방법 이 있 습 니까?답 은 분명히 있 을 것 이다. 사람들 은 보통 동기 화 자 물 쇠 를 넣 는 방식 으로 실현 하지만 이렇게 실현 하 는 것 은 비교적 번거롭다.그렇다면 더 좋 은 실현 방법 은 없 을 까?이 문 제 를 물 을 수 있다 면 반드시 있어 야 한다. 그렇지 않 으 면 체면 을 세 워 야 한다.우 리 는 JVM 의 클래스 로드 체 제 를 이용 하여 실현 할 수 있다.많은 상황 에서 JVM 은 우리 에 게 동기 화 통 제 를 제공 했다. 예 를 들 어:static{}
시 내부 클래스 를 사용 하여 이 내부 클래스 에서 대상 인 스 턴 스 를 만 듭 니 다.이렇게 되면 응용 프로그램 에서 내부 클래스 JVM 을 사용 하지 않 으 면 이 단일 클래스 를 불 러 오지 않 고 단일 대상 을 만 들 지 않 아
final
의 지연 로드 와 스 레 드 안전 을 실현 합 니 다.구현 코드 는 다음 과 같 습 니 다:
public class Singleton{
// ,
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
}
public void doSomething(){
//do something
}
}
이렇게 실 현 된 단일 사례 는 바로 스 레 드 가 안전 하 다 는 것 이다. 마 마 는 더 이상 나의 단일 사례 가 단일 사례 가 아니 라 는 것 을 걱정 할 필요 가 없다.
매 거 진 을 사용 하여 단일 모드 를 실현 하 다.
상기 한 사례 모델 의 실현 방식 을 제외 하고 우 리 는 매 거 진 유형 을 통 해 단리 모델 을 실현 할 수 있다. 이것 도
에서 추천 하 는 방식 이다.매 거 진 형식 을 사용 하여 단일 모드 를 다음 과 같이 실현 합 니 다.
public enum Singleton{
// , Singleton
instance;
public void doSomething(){
// do something ...
}
}
매 거 진 으로 이 루 는 게 더 쉽 지 않 을까요?매 거 방식 으로 이 루어 진 단일 모델 도 스 레 드 가 안전 하기 때문에 다 중 스 레 드 문 제 를 걱정 하지 않 고 대담 하 게 사용 할 수 있 습 니 다.
이상 은 단일 모드 의 사용 입 니 다. 지금 은 완전히 말 할 수 있 습 니 다. 당신 은 정말 단일 모드 를 사용 할 줄 압 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.