[독서] 2. 단례 모델
1. 구조 함수는 외부에 두지 않으며 일반적으로private이다
2. 공개된 정적 방법을 폭로하거나 매거진을 통해 하나의 단일 대상을 되돌려줍니다
3. 다중 스레드 환경에서 단일 클래스 대상이 있고 하나만 있는지 확보
4. 단일 클래스의 대상이 다시 반서열화될 때 대상을 재구성하지 않도록 확보한다
게으름뱅이 모드:
1 public class Singleton{
2 private static Singleton instance;
3 //1.
4 private Singleton{
5 }
6 //2.
7 //3. synchronized, , synchronized 。
8 // getInstance ,
9 public static synchronized Singleton getInstance(){
10 if(instance == null){
11 instance = new Singleton();
12 }
13 return instance;
14 }
15
16 }
장점: 필요할 때 실례화, 자원 절약
단점: getInstance () 를 호출할 때마다 동기화해야 하기 때문에 불필요한 동기화 비용이 발생합니다
Double checkLock 구현 예:
1 public class Singleton{
2 private volatile static Singleton singleton;
3 private Singleton (){}
4 public static Singleton getInstance() {
5 //
6 // ,
7 if (singleton == null) {
8 synchronized (Singleton.class) {
9 if (singleton == null) {
10 // null
11 singleton = new Singleton();
12 }
13 }
14 }
15 return singleton;
16 }
17 }
DCL에 문제가 있습니다.
singleton = new Singleton();
이 구절은 원자 조작이 아니라 세 가지를 나눌 수 있다.
(1).Singleton의 인스턴스에 메모리 할당
(2).Singleton의 구조 함수를 호출하여 객체를 만듭니다.
(3).singleton의 대상을 메모리에 분배된 공간으로 가리키다
그러나 JDK1과 Java 컴파일러는 프로세서의 순서를 어지럽히는 것을 허용하기 때문에5 이전 JVM에서 Cache, 레지스터 및 메인 메모리 리셋 순서에 대한 규정은 (2)와(3)의 순서가 고정되어 있지 않으며,
그래서 실행 순서가 123일 수도 있고 132일 수도 있어요.
만약 132라면, 이때 예를 들어 A 라인이 13까지 실행되고, 아직 2가 실행되지 않았으며, 이때 B 라인도 실행되고,singleton이 비어 있지 않은 것을 검사하고, 직접 사용하면 오류가 발생할 수 있습니다
만약 JDK 1이라면5 및 다음 릴리즈에 Volatile 키워드를 추가합니다.
private volatile static Singleton singleton;
이렇게 하면singleton 대상이 매번 메인 메모리에서 읽히는 것을 보장할 수 있다.
정적 내부 클래스 단일 예제 모드:
1 public class Singleton{
2 private Singleton{}
3 public static Singleton getInstance(){
4 return SingletonHolder.sInstance;
5 }
6 /*
7
8 */
9 private static class SingletonHolder{
10 private static final Singleton sInstance = new Singleton();
11 }
12 }
장점: getInstance를 처음 호출해야만 sInstance가 초기화되고, 첫 번째 호출 시 가상 기기가singletonHolder 클래스를 불러옵니다.
이렇게 하면 라인의 안전을 보장할 수 있고, 단일 사례의 대상이 유일하며, 단일 사례의 실례화를 지연시킬 수 있다
열거 예:
1 public enum SingletonEnum{
2 INSTANCE;
3 }
장점: 라인이 안전하고 유일하며 반서열화도 방지할 수 있다.
단일 인스턴스 객체의 고유한 손상:
1. 반사
2. 서열화와 반서열화
http://www.hollischuang.com/archives/1144
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.