자바 ~ 싱글 톤 디자인 패턴

마이크로 채널 대중 번호 : 프로그래머 호텔
개발 툴, 자바 기초, 자바 동시성, 파이썬, JVM, 분산, 마이크로 서비스, 메시지 큐, 힘내, 소스 코드 분석, 데이터베이스, 디자인 패턴, 기계에 의해 인터뷰를 포함하여 기술 프로그래머 건조 제품을, 공유에 초점 도움 삶과 다른 프로그램 당신은 도로 우회 프로그램.
읽기, 환영 관심에 감사드립니다

싱글

(싱글 톤) 모드 싱글 정의 : 클래스와 하나의 예를 들어, 전체 시스템에 대한 자신의 예를 사용할 수 있습니다. 예를 들어, Windows는 여러 Windows 작업 관리자 및 메모리 자원의 낭비를 열어 피할 수있는 작업 관리자를 열고, 각 윈도우의 내용을 표시 할 수있는 것은 일관성 등 잘못된 나타납니다.

컴퓨터 시스템뿐만 아니라 연결 풀링 윈도우 휴지통, 스레드 풀에 시스템, 파일 시스템, 다중 스레드를 운영, 그래픽 카드 드라이버 개체, 프린터 스풀러 서비스, 응용 프로그램의 로그 오브젝트, 데이터베이스, 웹 사이트에서 카운터는, 구성 개체 웹 응용 프로그램은 응용 프로그램 대화 시스템 캐싱은 종종 하나의 실시 예로 설계.

싱글 세 가지 특성을 갖는다 :
-; 만 개체의 단일 인스턴스
- 오브젝트는 하나의 실시 예에서 단일 클래스 자체에 의해 생성되어야한다
- 글로벌 실시 예에 대한 단일 액세스 포인트에 대한 외부 액세스를 제공하는 단일 단계;

기아의 1, 하나의 경우

이 모델의 특징 :로드 된 클래스의 getInstance 싱글이 존재하고있다 메소드를 호출하기 전에 다음 사항을 확인하기 위해 싱글 톤을 생성하면.

번호 : 게으른 초기화는
멀티 스레드 안전 여부 :는
달성하기 어려운 : 간단한
장점 :하지 잠금, 효율이 향상됩니다.
단점 : 클래스가 메모리를 낭비로드 될 때 초기화.

다음과 같이 코드입니다 :

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}

2, 예 게으른 하나

이 모델의 특징 : 하나의 사건을 생성하지 않는 첫 번째 호출 getlnstance 방법은 싱글을 만들 경우에만 클래스가로드 될 때.

是否 Lazy 初始化:是
是否多线程安全:是
实现难度:复杂
描述:这种方式采用双重加锁机制,安全且在多线程情况下能保持高性能。
getInstance() 的性能对应用程序很关键。

代码如下:

public class Singleton {
    private volatile static Singleton instance = null;////保证 instance 在所有线程中同步

    private Singleton() {//private 避免类在外部被实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {//使用synchronized关键字来同步获取实例,保证单例的唯一性
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

从上述代码可以看到,双重加锁中有两次判断。第一次检查是避免不必要的上锁。相对加锁的懒汉模式而言,第二次检查是,在给当前线程加锁后,例行检查更加安全。

3、枚举

默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。实际上
枚举类隐藏了私有的构造器。
枚举类的域 是相应类型的一个实例对象
是否 Lazy 初始化:否
是否多线程安全:是
实现难度:简单

描述:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少用。不能通过 reflection attack 来调用私有构造方法。

代码如下:

public enum Singleton {
    INSTANCE;   
    public void doSomethingMethod() {
    }
}

图片显示

下面的是我的公众号二维码图片,欢迎关注。

图注:程序员Hotel
图注:程序员Hotel

추천

출처www.cnblogs.com/xiexinxin/p/12044229.html