싱글 : (01)에 설명 된 자바 디자인 패턴

A, 싱글

(1)의 개념을 보여주는

정의 싱글 톤 디자인 패턴 :이 클래스의 하나의 인스턴스 만 보장하고, 시스템이 자동으로 개체의 인스턴스를 제공합니다.

2, 샘플 코드

package com.model.test;
public class Singleton {
    // 使用静态变量记录唯一实例
    private static Singleton singleton = null;
    private Singleton (){}
    public static Singleton getInstance (){
        if (singleton == null){
            singleton = new Singleton() ;
        }
        return singleton ;
    }
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance() ;
        Singleton singleton2 = Singleton.getInstance() ;
        /**
         * com.model.test.Singleton@15db9742
         * com.model.test.Singleton@15db9742
         */
        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

싱글은 예를 생산할 수있는 시스템을 보장하기 위해, 싱글 생성자 전용 개질제라고 자동 생성. 위의 코드는 게으른 사람의 부하로 알려져있다 : 객체를 사용하는 수단이 먹을 단지 배가 할 만드는 것이었다 경우에만 사용할 수 있습니다.

둘째, 보안 스레드

이 목적을 입력한다하는 싱글 == null의 분석 나오는 실을 가정하면, 오브젝트를 생성하는 데 시간이 걸리기 때문에, 상기 코드에서, 복수의 스레드가 객체 인스턴스를 요청할 명백한 보안 쓰레드에 존재 몇 스레드를 통해 동시에, 그 때 개체 인스턴스를 얻을 것이다 경우 생성 과정은 다음이 소위 스레드 안전 문제입니다.

한 동기 제어 모드

package com.model.test;
public class Singleton {
    // 使用静态变量记录唯一实例
    private static Singleton singleton = null;
    private Singleton (){}
    public static synchronized Singleton getInstance (){
        if (singleton == null){
            singleton = new Singleton() ;
        }
        return singleton ;
    }
}

이러한 동작은 시스템 성능에 영향을 미칠 것

2, 굶주린 형 부하

public class Singleton {
    // 使用静态变量记录唯一实例
    private static Singleton singleton = new Singleton();
    private Singleton (){}
    public static Singleton getInstance (){
        return singleton ;
    }
}

여기에 첫 번째 중 개체 만들기, 직접 사용할 필요가있다;

3, 더블-확인

public class Singleton {
    // 使用静态变量记录唯一实例
    // volatile可以确保当singleton被初始化后,多线程才可以正确处理
    // 被volatile修饰的变量的值,将不会被本地线程缓存
    // 对该变量读写都是直接操作共享内存,确保多个线程能正确的处理该变量。
    private static volatile Singleton singleton = null ;
    private Singleton (){}
    public static Singleton getInstance (){
        // 如果实例不存在,则进入同步区
        if (singleton == null){
            // 只有第一次才会彻底执行这里面的代码
            synchronized (Singleton.class) {
                if (singleton == null){
                    singleton = new Singleton() ;
                }
            }
        }
        return singleton ;
    }
}

4 열거

package com.model.design.base.node01.singleton;
import org.junit.Test;
/**
 * 类级内部类里面创建对象实例
 */
public class C06_Singleton {
 @Test
 public void test01 (){
 SingletonDemo INSTANCE1 = SingletonDemo.INSTANCE ;
 SingletonDemo INSTANCE2 = SingletonDemo.INSTANCE ;
 System.out.println(INSTANCE1 == INSTANCE2);
 INSTANCE1.info();
 INSTANCE2.info();
 }
}
enum SingletonDemo {
 INSTANCE ;
 public void info (){
 System.out.println("枚举方式实现单例");
 }
}

셋째, 지연 클래스 초기화

1, 기본 개념

1) 클래스 수준 내부 클래스
  간단히 말해, 클래스 레벨 내부 클래스는 내부 클래스 유형의 고정 부재의 변형이 있다는 것을 의미한다. 이 개체 수준 내부 클래스라고 내부 클래스 형의 멤버의 정적 변경이없는 경우.
  그 외부 물체와 물체 사이의 의존성이 존재하지 않는 외부 클래스에 대응하여 그 내부 클래스의 클래스 레벨 정적 컴포넌트는이를 직접 생성 될 수있다. 내부 클래스 객체 레벨의 예이지만, 외부 개체의 인스턴스에 바인딩된다.
  클래스 수준 내부 클래스는 정적 방법으로 정의 될 수있다. 회원 만이 정적 방법으로 클래스의 외부 정적 메소드 또는 필드를 참조 할 수 있습니다.
  클래스 수준 외측 클래스 등가의 내부 클래스의 멤버 만 처음에만로드된다 사용 하였다.

기본적으로 2), 멀티 스레드 동기화 잠금
  주로 뮤텍스 동기화 컨트롤을 추가 동기화의 사용을 통해, 동시성 문제를 해결하기 위해 멀티 스레드 개발한다. 그러나 일부의 경우, JVM은 암시 적으로 동기화를 수행하고있다,이 경우는 자신의 제어를 동기화 오지 않는다. 이들은 다음을 포함한다 :

  1.由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时
  2.访问final字段时
  3.在创建线程之前创建对象时
  4.线程可以看见它将要处理的对象时

2, 구현

아주 간단한 스레드 안전을 구현하기 위해 정적 초기화 방법을 사용할 수 있습니다, JVM 스레드의 안전을 보장하기 위해 수 있습니다. 예를 들어, 배고픈 사람 유형 구현의 앞에,시 클래스에 관계없이 공간의 특정 폐기물이 있는지 여부의 개체를 초기화에로드됩니다.
한가지 가능한 방법은 내부 내부 클래스이 클래스 레벨의 객체 인스턴스를 생성하는 클래스 레벨 내부 클래스를 사용하는 것이다. 그 결과, 그들은 클래스 내부 클래스이 클래스를 사용하지 않는, 그것은 동시에 게으른로드 및 스레드 안전을 달성하기 위해, 객체의 인스턴스를 생성하지 않습니다.

public class LazySingleton {
    /**
     * 类级内部类
     */
    private static class SingletonHolder {
        private static LazySingleton lazySingleton = new LazySingleton() ;
    }
    public static LazySingleton getInstance (){
        return SingletonHolder.lazySingleton ;
    }
    public static void main(String[] args) {
        LazySingleton lazySingleton1 = LazySingleton.getInstance() ;
        LazySingleton lazySingleton2 = LazySingleton.getInstance() ;
        /**
         * com.model.test.LazySingleton@15db9742
         * com.model.test.LazySingleton@15db9742
         */
        System.out.println(lazySingleton1+";;"+lazySingleton2);
    }
}

네, JDK 소스 싱글

런타임 싱글 소스를 알고 있습니다.

1 케이스 프레젠테이션

/**
 * JDK 单例模式分析
 */
public class C07_Singleton {
 public static void main(String[] args) {
 Runtime runtime1 = Runtime.getRuntime() ;
 Runtime runtime2 = Runtime.getRuntime() ;
 /*
 * 1229416514
 * 1229416514
 */
 System.out.println(runtime1.hashCode());
 System.out.println(runtime2.hashCode());
 }
}

2 소스 코드 분석

public class Runtime {
 private static Runtime currentRuntime = new Runtime();
 public static Runtime getRuntime() {
 return currentRuntime;
 }
 private Runtime() {}
}

싱글 모드 기반 구현을 굶주린.

다섯, 스프링 프레임 워크 응용 프로그램

1, 테스트 클래스를 생성

public class UserBean {
}

2, Spring 설정 파일

<!-- 单例Bean -->
<bean id="user" 
class="com.model.design.spring.node01.singleton.UserBean" />

3, 테스트 대상은 콩을 읽고

package com.model.design.spring.node01.singleton;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Spring框架中单例模式
 */
public class S01_Singleton {
    @Test
    public void test01 (){
        ApplicationContext context01 = new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        ApplicationContext context02 = new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        UserBean user01 = (UserBean)context01.getBean("user") ;
        UserBean user02 = (UserBean)context01.getBean("user") ;
        UserBean user03 = (UserBean)context02.getBean("user") ;
        // com.model.design.spring.node01.singleton.UserBean@364841
        System.out.println(user01);
        // com.model.design.spring.node01.singleton.UserBean@364841
        System.out.println(user02);
        // com.model.design.spring.node01.singleton.UserBean@c4711c
        System.out.println(user03);
    }
}

결론
순수한 단일 디자인 패턴으로 봄 싱글 큰 차이점
같은 클래스 로더하지만이 애플리케이션 컨텍스트 두 가지를로드 할 수 있지만, 예를 들면 같은이 UserBean하지 않습니다. 즉, 단일 객체 스프링 프레임 워크는 응용 프로그램을 기반으로합니다.

VI 요약하는 단일

1 주

单例模式注意事项和细节说明
1) 单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new Object() 的方式。
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象。

2, 장점과 단점

优点:
1、单例模式只会创建一个对象实例,减少内存消耗
2、设置全局访问点,优化共享资源的访问
缺点:
1、没有接口,很难扩展
2、不利于测试
3、与单一职责原则冲突

세븐, 소스 주소

GitHub地址:知了一笑
https://github.com/cicadasmile/model-arithmetic-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/model-arithmetic-parent


추천

출처www.cnblogs.com/cicada-smile/p/11204316.html