java 디자인 모델의 단례 모델 상세

3288 단어 java단일 모드
Singleton 모드의 취지는 특정한 클래스가 하나의 실례만 있고 전역적인 접근점을 제공하는 데 있다.다른 스태프들이 우리 클래스를 실례화하는 것을 방지하기 위해
이 종류를 위한 유일한 구조기를 만들 수 있으며, 구조기의 가시성을 사유로 설정할 수 있습니다.주의해야 할 것은, 만약 우리가 다른 비사유적인 구조기를 만들었거나, 아예 이런 종류를 언급하지 않았다면
구조기를 공급하면 다른 사람들은 여전히 우리의 종류를 실례화할 수 있다.만약 미리 단례 대상을 만들고 싶지 않다면, 우리는 이 단례 대상을 처음 사용할 때 그것을 만들 수 있다. 즉,
정체 초기화.정체 초기화 단례 대상은 두 가지 이유가 있다.
1. 정적 초기화 시간에 단일 대상을 어떻게 초기화하는지에 대한 충분한 정보가 없을 수도 있다.
2. 정체 초기화 사례를 선택한 목적은 데이터베이스 연결, 특히 특정한 세션에서 이 사례가 필요하지 않은 응용 프로그램과 같은 자원을 기다리기 위해서일 수도 있다.
만약 다중 스레드 환경에서 단일 사례에 대해 정지 초기화를 사용한다면, 우리는 여러 개의 스레드가 동시에 초기화되는 것을 조심해야 한다
일반적으로 단일 예제 모드는 Java 언어에서 두 가지 구축 방식이 있습니다.
게으름뱅이 방식: 전체 국면의 단례 실례가 처음 사용될 때 구축되는 것을 가리킨다.초기화 지연.
굶주린 방식: 전체 국면의 단일 실례가 클래스를 불러올 때 구축되는 것을 가리킨다.절박하게 초기화하다.
1. 굶주린 한식

public class Singleton1 {
 
 private Singleton1() {
 }
 //  .
 //  private  

 private static Singleton1 instance = new Singleton1();

 /** *//**
 *  class ,   
 * @return
 */
 public static Singleton1 getInstance() {
 return instance;
 }
}
2, 게으름뱅이

public class Singleton2 {

 private static Singleton2 instance = null;
 /** *//**
 *  , ,    
 *  , !
 * @return
 */
 public static Singleton2 getInstance() { 
 if (instance == null)
 instance = new Singleton2();
 return instance;
 }
}
다음 주요 다선정 문제는 게으름뱅이 사례에서 단선정은 문제가 없지만 다선정 때 두 개 이상의 Singletion2 실례가 나타날 수 있다.
예를 들어 스레드 1은 instance==null을 진실로 판단하고 new 조작을 실행할 때 new 조작을 실행하기 전에 진실로 판단한 후에 스레드 2가 판단 조작을 실행하는데 이때 instance는null이다.따라서 스레드 2도 new 작업을 실행합니다.이와 같이 높은 병발 아래에는 두 개 이상의 Singletion2의 실례가 존재할 수 있다.분명히 이것은 정확하지 않다.
따라서 코드 변경은 다음과 같습니다.

public class Singleton3 {

 private static Singleton3 instance = null;
 /** *//**
 *  , ,    
 *  , !
 *  , 
 * @return
 */
 public static synchronized Singleton3 getInstance() { 
 if (instance == null)
 instance = new Singleton3();
 return instance;
 }

}
그러나 이렇게 하면 또 하나의 문제가 생겼다. 매번 실례를 얻을 때마다 방법이 동기화되고 성능이 매우 영향을 받는 것이 분명하기 때문에 코드를 계속 변경하면 다음과 같다.
volatile, 동기화 대신 더 낮은 대가로
동기화 대가보다 volatile를 사용하는 이유가 무엇입니까?
동기화의 대가는 주로 그 범위에 의해 결정되고 동기화의 범위를 낮출 수 있다면 프로그램 성능을 대폭 향상시킬 수 있다.
volatile의 덮어쓰기 범위는 변수 수준일 뿐입니다.그래서 그것의 동기화 대가는 매우 낮다.
volatile의 원리는 무엇입니까?
volatile의 의미는 사실 프로세서에 저를 작업 메모리에 넣지 말고 메모리에서 직접 조작해 주십시오.(작업 메모리는 자바 메모리 모델 참조)
따라서 다중 핵이나 다중 루틴이 이 변수에 접근할 때 메모리를 직접 조작하는데 이것은 본질적으로 변수 공유를 한다.
volatile의 장점은 무엇입니까?
1, 더 큰 프로그램 처리량
2, 더 적은 코드로 다중 스레드 구현
3, 프로그램의 신축성이 비교적 좋다
4, 너무 높은 학습 비용이 필요 없어 이해하기 쉽다
volatile는 어떤 열세가 있습니까?
1. 문제가 생기기 쉽다
2, 디자인하기 어렵다
volatile는 jdk를 사용하여 1.5 버전 및 1.5 이상을 요구합니다.
개선된 코드는 다음과 같습니다.

public class Singleton4 {
 private static volatile Singleton4 instance;
 /** *//**
 *  
 * @return
 */
 public static Singleton4 getInstance()
 {
 if (instance == null)
 {
 synchronized(Singleton4.class) { //1
 if (instance == null) //2
 instance = new Singleton4(); //3
 }
 }
 return instance;
 }
}

좋은 웹페이지 즐겨찾기