간단 & 알 기 쉬 운 스 레 드 안전 사례 모드

3954 단어
1. 머리말
단일 모델 은 23 가지 디자인 모델 중에서 가장 흔히 볼 수 있 는 디자인 모델 중 하나 입 니 다. 단일 모델 을 정확하게 작성 하 는 것 은 모든 프로그래머 가 파악 해 야 할 기술 입 니 다. 단일 모델 도 면접 에서 자주 고찰 하 는 내용 입 니 다. 다음은 하나의 면접 문제 로 오늘 의 내용 을 설명 하 겠 습 니 다.
           ,            ?             ?

2. 단일 모델 소개
2.1 정의
수학 과 논리학 에서 singleton 은 '있 고 하나의 요소 만 있 는 집합' 이 라 고 정의 했다.단일 모드 의 최초 정 의 는 (에디슨 비 슬 리, 1994) 에 나 타 났 다. "하나의 클래스 에 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 하도록 보장 합 니 다." 자바 의 단일 모드 정 의 는 "하나의 클래스 가 있 고 하나의 인 스 턴 스 만 있 으 며 전체 시스템 에 자체 적 으로 실례 화 되 어 제공 합 니 다."
2.2 실현 요점 단일 사례 모델 의 실현 요점 은 다음 과 같다.
  • 구조 함수 민영화
  • 인 스 턴 스 를 얻 기 위해 클래스 방법 을 제공 합 니 다
  • 스 레 드 안전 에 주의 하 세 요
  •     public class Singleton {
     //       ,      new      
            private Singleton() {
            }
    //        ,         
            private static Singleton instance = null;
    //              ,          
            public static  synchronized Singleton getInstance(){
                if(instance==null){
                       instance=new Singleton();
                }
                return instance;
            }
    
            
        }
    

    3. 라인 이 안전 한 단일 모드
    3.1 굶 주 린 남자 모델
    public class Singleton {
        
    private static Singleton singleton = new Singleton();
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            return singleton;
        }
    
    }
    

    굶 주 린 사람 모드 가 왜 스 레 드 가 안전 한 지 이해 하려 면 JVM 류 의 로드 체 제 를 알 아야 합 니 다.자바 의 모든 클래스 는 클래스 로 더 에서 JVM 에 불 러 와 야 실 행 됩 니 다.언제 클래스 의 로 딩 을 촉발 합 니까?new 를 사용 하여 실례 화 대상 을 만 들 고 클래스 의 정적 필드 를 읽 거나 설정 하 며 클래스 의 정적 방법 을 호출 할 때 JVM 은 이러한 컴 파일 된 class 파일 이 불 러 왔 는 지 확인 합 니 다. 없 으 면 클래스 를 가상 컴퓨터 메모리 에 불 러 오고 데 이 터 를 검사, 변환 분석, 초기 화 합 니 다.최종 적 으로 직접 사용 할 수 있 는 자바 형식 을 형성한다.초기 화 과정 은 클래스 의 구조 기 방법 을 호출 합 니 다. 방법 은 클래스 변 수 를 할당 하 는 동시에 가상 기 회 는 다 중 스 레 드 환경 에서 정확하게 잠 금, 동기 화 를 보장 합 니 다.굶 주 린 사람 모드 와 결합: 외부 에서 Singleton. getgetInstance () 를 호출 할 때 getgetInstance 는 클래스 방법 이기 때문에 가상 기 회 는 Singleton. class 가 가상 컴퓨터 메모리 에 불 러 왔 는 지 확인 합 니 다. 없 으 면 가상 컴퓨터 의 클래스 로 딩 시스템 을 촉발 하고 초기 화 단계 에 이 르 렀 을 때 클래스 변수 singleton 에 값 을 부여 합 니 다. 즉, 실행 하 는 것 입 니 다.
    private static Singleton singleton = new Singleton();
    

    또한 가상 기 회 는 new Singleton () 을 실행 할 때 스 레 드 가 안전 하고 마지막 으로 singleton 으로 돌아 갑 니 다.Singleton. class 가 불 러 온 것 을 발견 하면 singleton 으로 돌아 갑 니 다.
    3.2 이중 검사 잠 금 (DCL)
    public class Singleton {
            private Singleton() {
            }
    
            private static volatile Singleton instance = null;
    
            public static Singleton getInstance() {
                if (instance == null) {
                    synchronized (Singleton.class) {
                        if (instance == null) {
                            instance = new Singleton();
                        }
                    }
    
                }
                return instance;
            }
    
        }
    
  • memory = allocate(); //1: 할당 대상 의 메모리 공간
  • ctorInstance(memory); //2: 대상 초기 화
  • instance = memory; //3: 인 스 턴 스 가 방금 분 배 된 메모리 주 소 를 가리 키 지만 재 정렬 을 거 친 후 다음 과 같 습 니 다.
  • memory = allocate(); //1: 할당 대상 의 메모리 공간
  • instance = memory; //3: 인 스 턴 스 가 방금 분 배 된 메모리 주 소 를 가리 키 도록 설정 합 니 다. / 주의 하 십시오. 대상 이 초기 화 되 지 않 았 습 니 다!
  • ctorInstance(memory); //2: 초기 화 대상 은 두 번 째 단계 와 세 번 째 단 계 를 순서 로 바 꿉 니 다. 단일 스 레 드 상황 에서 프로그램 실행 결과 에 영향 을 주지 않 지만 다 중 스 레 드 상황 에 서 는 다 릅 니 다.스 레 드 A 가 인 스 턴 스 = memory 를 실 행 했 습 니 다. (이것 은 다른 스 레 드 B 에 게 보 이 는 것 입 니 다) 이때 스 레 드 B 는 외부 if (instance = = null) 를 실 행 했 습 니 다. 인 스 턴 스 가 비어 있 지 않 은 것 을 발견 하면 바로 돌아 갑 니 다. 그러나 완전히 초기 화 되 지 않 은 인 스 턴 스 를 얻 었 습 니 다. 사용 할 때 반드시 위험 이 있 습 니 다. 이것 이 바로 이중 검사 잠 금 문제 입 니 다!

  • 3.3 내부 클래스 지연 로드
    public class Singleton{
        private Singleton(){}
        private  static class SingletonHolder{
            public final static Singleton instance = new Singleton();
        }
    
        public static Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }
    

    좋은 웹페이지 즐겨찾기