单例设计模式

1单例模式概述

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
通常单例模式在Java语言中,有两种构建方式:
懒汉方式:指全局的单例实例在第一次被使用时构建。
饿汉方式:指全局的单例实例在类装载时构建
单例模式在构建的时候主要包括以下两个步骤
1、私有化构造方法
2、提供一个静态方法

2 实例

1、懒汉式

public class Singleton1 {
    private final static Singleton1 SINGLETON_1 = new Singleton1();

    private Singleton1() {

    }

    public static Singleton1 getSingleton1() {
        return SINGLETON_1;
    }
}

线程安全,在类装载的时候实例化对象,避免线程同步的问题
2、懒汉式

public class Singleton2 {
    private static Singleton2 singleton2;

    static {
        singleton2 = new Singleton2();
    }

    private Singleton2() {

    }

    public static Singleton2 getSingleton2() {
        return singleton2;
    }
}

线程安全,在类装载的时候实例化对象,避免线程同步的问题
3、饿汉式

public class Singleton3 {
    private static Singleton3 singleton3 = null;

    private Singleton3() {

    }

    public static Singleton3 getSingleton3() {
        if (singleton3 == null) {
            singleton3 = new Singleton3();
        }
        return singleton3;
    }
}

线程不安全,最好不要这样写
4、饿汉式

public class Singleton4 {
    private static Singleton4 singleton4 = null;

    private Singleton4() {

    }

    public static synchronized Singleton4 getSingleton4() {
        if (singleton4 == null) {
            singleton4 = new Singleton4();
        }
        return singleton4;
    }
}

线程安全,但是在多线程环境下效率并不高
5、双重校验锁

public class Singleton5 {
    private volatile static Singleton5 singleton5 = null;

    private Singleton5() {

    }

    public static Singleton5 getSingleton5() {
        if (singleton5 == null) {
            synchronized (Singleton5.class) {
                if (singleton5 == null) {
                    singleton5 = new Singleton5();
                }
            }
        }
        return singleton5;
    }
}

使用双重校验锁,线程安全
6、枚举类

public enum  Singleton6 {
    SINGLETON_6;
    public void whateverMethod() {

    }

}

枚举类,线程安全
7、静态内部类

public class Singleton7 {
    private Singleton7() {

    }

    private static class Singleton7Instance {
        private static final Singleton7 SINGLETON_7 = new Singleton7();

    }

    public static Singleton7 getSingleton7() {
        return Singleton7Instance.SINGLETON_7;
    }
}

8、

posted on 2019-05-24 20:14  海之浪子  阅读(251)  评论(1编辑  收藏  举报

导航