싱글 톤 패턴의 목적은 클래스에 인스턴스가 하나만 있고 글로벌 액세스 포인트도 제공하는 것입니다. 다른 근로자가 수업을 인스턴스화하는 것을 막기 위해
이 클래스의 고유 한 생성자를 생성하고 생성자의 가시를 비공개로 설정할 수 있습니다. 다른 비 개인적인 생성자를 만들거나 수업에 대해 전혀 언급하지 않으면 주목할 가치가 있습니다.
생성자의 경우 다른 사람들은 여전히 우리 수업을 인스턴스화 할 수 있습니다. 싱글 톤 객체를 미리 만들고 싶지 않다면 처음으로 싱글 톤 객체를 사용할 때까지 기다릴 수 있습니다.
지연 초기화. 싱글 톤 객체의 초기화가 지연되는 두 가지 이유가 있습니다.
1. 아마도 정적 초기화 시간에 싱글 톤 객체를 초기화하는 방법에 대한 정보가 충분하지 않습니다.
2. LAG 초기화 싱글 턴을 선택하는 목적은 데이터베이스 연결과 같은 리소스, 특히 특정 특정 세션 에서이 싱글 톤이 필요하지 않은 응용 프로그램에서 기다리는 것일 수 있습니다.
싱글 톤이 멀티 스레드 환경에서 초기화되면 여러 스레드가 동시에 초기화되는 것을 방지해야합니다.
일반적으로 싱글 톤 패턴은 자바 언어로 구축됩니다.
Lazy Way : 처음으로 사용될 때 글로벌 싱글 톤 인스턴스가 구축되는 것을 나타냅니다. 초기화 지연.
Hungry Man Method : 클래스 로딩 중에 구축되는 글로벌 단일 인스턴스를 나타냅니다. 긴급한 초기화.
1. 배고픈 중국어 싱글 톤
공개 클래스 Singleton1 {private singleton1 () {} // 내부적으로 자신의 인스턴스를 정의합니다. // 이것은 비공개입니다. private static singleton1 인스턴스 = 새로운 싱글 톤1 (); /** * // ** * 여기 에이 클래스에 대한 외부 액세스를위한 정적 메소드가 있습니다.이 클래스에 직접 액세스 할 수 있습니다 * @return */public static singleton1 getInstance () {return instance; }}2. 게으른 싱글 톤 클래스
공개 클래스 싱글 톤 2 {private static singleton2 인스턴스 = null; /*** // ***이 방법은 위에 비해 개선됩니다. 매번 객체를 생성 할 필요는 없지만 처음 * 사용하면 인스턴스를 생성하여 효율성을 향상시킵니다! * @return */ public static singleton2 getInstance () {if (instance == null) instance = new Singleton2 (); 반환 인스턴스; }}다음은 주요 멀티 스레딩 문제입니다. 게으른 싱글 톤에서는 단일 스레딩에 아무런 문제가 없지만 멀티 스레딩은 둘 이상의 Singletion2 인스턴스가있을 수 있습니다.
예를 들면 : 스레드 1이 인스턴스 == NULL을 판단 할 때, 새 작업을 스캔 할 때 새 작업을 수행하기 전에 및 새 작업을 수행 한 후 스레드 2는 판단 작업을 수행하면 인스턴스가 여전히 NULL입니다. 따라서 스레드 2는 또한 새로운 작업을 수행합니다. 그리고 높은 동시성 하에서, 단일 레틀온스의 두 개 이상의 인스턴스가있을 수있다. 분명히 이것은 잘못되었습니다.
따라서 다음과 같이 코드를 변경하십시오.
공개 클래스 Singleton3 {private static singleton3 인스턴스 = null; /*** // ***이 방법은 위에 비해 개선됩니다. 매번 객체를 생성 할 필요는 없지만, 처음 * 사용하면 인스턴스를 생성하여 효율성을 향상시킵니다! * 멀티 스레딩의 오류를 피하기 위해 동기화 플래그가 추가되었습니다 * @return */ public static synchronized singletleton3 getInstance () {if (instance == null) 인스턴스 = new Singleton3 (); 반환 인스턴스; }}그러나 이것은 또 다른 문제를 만듭니다. 인스턴스가 검색 될 때마다 메소드가 동기화됩니다. 분명히 성능은 크게 영향을 받으므로 다음과 같이 코드를 계속 변경하십시오.
휘발성, 동기화를 저렴한 비용으로 교체하십시오
휘발성이 동기화보다 저렴한 이유는 무엇입니까?
동기화 비용은 주로 커버리지 범위에 의해 결정됩니다. 동기화의 커버리지 범위를 줄일 수 있다면 프로그램 성능을 크게 향상시킬 수 있습니다.
휘발성의 적용 범위는 가변 레벨에만 해당됩니다. 따라서 동기화 비용은 매우 낮습니다.
휘발성의 원리는 무엇입니까?
휘발성의 의미론은 실제로 프로세서에 작업 메모리를 사용하지 말라고 말하는 것입니다. 메인 메모리에서 직접 작동하십시오. (자세한 내용은 작업 메모리에 대한 Java 메모리 모델 참조)
따라서 멀티 코어 또는 멀티 스레딩이 변수에 액세스 할 때 기본 메모리를 직접 작동하여 기본적으로 가변 공유를 달성합니다.
휘발성의 장점은 무엇입니까?
1. 더 큰 프로그램 처리량
2. 멀티 스레딩을 구현하려는 코드가 적습니다
3.이 프로그램은 확장 성이 향상됩니다
4. 이해하기가 더 쉽고 학습 비용이 너무 높을 필요가 없습니다.
휘발성의 단점은 무엇입니까?
1. 문제가 발생하기 쉬운
2. 디자인하기가 어렵습니다
휘발성 사용 JDK는 버전 1.5 이상이 필요합니다.
개선 된 코드는 다음과 같습니다 (Double Lock이라고도 함).
공개 클래스 싱글 톤 4 {개인 정적 휘발성 싱글 톤 4 인스턴스; /*** // *** 멀티 스레딩 애플리케이션 및 성능 최적화를 달성하기위한 이중 잠금* @return*/public static singleton4 getInstance () {if (instance == null) {synchronized (singleton4.class) {// 1 if (instast == null) // 2 인스턴스 = new Singleton4 (); // 3}} return 인스턴스; }}