Android 단일 모드의 네 가지 실현 방식
하나.굶주림식
public class SingletionStarving {
private static final SingletionStarving mInstance = new SingletionStarving();
private SingletionStarving() {
}
public static SingletionStarving getInstance() {
return mInstance;
}
}
2.게으름뱅이식
public class SingletionSlacker {
private static SingletionSlacker mInstance;
private SingletionSlacker() {}
public static synchronized SingletionSlacker getInstance() {
if (mInstance == null) {
mInstance = new SingletionSlacker();
}
return mInstance;
}
}
셋.이중 검사 잠금 방식
인터넷에서 가장 많이 추천하고 사용하는 방법
public class Singletion {
private static Singletion mInstance;
private Singletion() {}
public static Singletion getmInstance() {
if (mInstance == null) {
synchronized (Singletion.class) { if (mInstance == null) {
mInstance = new Singletion (); }
}
}
return mInstance;
}
}
private static Singletion mInstance;
private Singletion() {}
public static Singletion getmInstance() {}
jvm 특성 때문에 무작위로 실행할 수 있습니다. 위의 세 문장 코드의 순서가 정해지지 않으면 실효 문제가 발생할 수 있습니다.1단계, 만약 A 스레드가 getmInstance () 를 실행하고 구조 방법을 실행하지 않았다면 Singletion ()
2단계, 이때 B 스레드에서 getmInstance()가 호출됩니다.A가 getmInstance () 를 실행했기 때문에 mInstance 를 비워 두지 않고 가져옵니다.
3단계, B가 직접 얻기 때문에 실제 상황은 A라인 구조 방법이 아직 실행되지 않았기 때문에 mInstance는 비어 있다.
이 상황은 발생 확률이 비교적 적지만 일종의 상황이다.이런 상황을 해결하기 위해java1.6은volatile 키워드를 추가하기 시작했다
private volatile static Singletion mInstance;
이렇게 하면 방식이 효력을 잃는 상황을 피할 수 있다.비록 volatile가 약간의 성능을 소모할 수 있기 때문에 가장 좋은 쓰기 방법은
public class Singletion {
private volatile static Singletion mInstance;
private Singletion () {}
public static Singletion getmInstance() { if (mInstance == null) {
synchronized (Singletion.class) { if (mInstance == null) {
mInstance = new Singletion(); }
}
}
return mInstance;
}
}
비록 volatile는 방식을 완벽하게 하지만, volatile 키워드가 없는 작법은 기본적으로 대부분의 상황을 만족시킬 수 있다.높은 병렬이나java1.6 이전의 코드에서 실행하지 않으면.사.정적 내부 클래스 방식
public class SingletionInternalClass {
private SingletionInternalClass() {}
public static SingletionInternalClass getInstance() {
return SingletionInternalClassHolder.instance;
}
private static class SingletionInternalClassHolder {
private static final SingletionInternalClass instance = new SingletionInternalClass();
}
}
구조 함수는private로 수식되어 외부에 접근할 수 없습니다사용할 때 getInstance를 호출해야 초기화됩니다.
get Instance를 호출하고 Singletion Internal Class Holder 클래스를 불러와서 스레드 안전을 확보하고 단일 사례의 유일성을 확보합니다
총결산
단례 모델은 그런 방식으로 실현될 수 없고, 핵심 사상은 모두 같다
1. 구조 함수 사유화, 정적 방법으로 유일한 실례 얻기
2. 스레드 보안
마지막으로 문장의 **이중 잠금 방식과 정적 내부 클래스의 방식**을 사용하여 단일 모드를 만드는 것을 추천합니다.
이상은 Android 단일 모드의 네 가지 실현 방식에 대한 상세한 내용입니다. Android 단일 모드의 실현에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.