java 设计模式

java 单例模式

2018-08-09  本文已影响9人  torres9gogogo

1、定义:
所谓单例类就是指该类只能有一个实例对象,无论如何获取拿到的都是同一个对象。
2、用处:
整个系统中只允许new 一个对象。spring 容器默认单实例。
3、实现:
(1)定义一个静态全局对象引用。
(2)该类构造函数保护,private。
(3)提供静态方法获取该实例。
(4)由于需要一个全局对象引用,考虑多线程获取的安全问题。
(5)性能,懒加载or初始化加载。

package designpattern;

public class SingletonPattern {

    public static void main(String[] args) throws Exception {
        Singleton1 singleton1 = Singleton1.getInstance();
        Singleton1 singleton2 = Singleton1.getInstance();
        System.out.println(singleton1 == singleton2);
    }

}

//非线程安全,获取时加载 。
//thread1 、2 同时 进入 if (singleton1 == null) {
//可能获取不同的实例对象
class Singleton1 {

    private static Singleton1 singleton1 = null;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (singleton1 == null) {
            singleton1 = new Singleton1();
        }
        return singleton1;
    }
}

//线程安全,饿汉式 ,加载字节码文件初始化一个该实例
//jvm加载字节码进行类的初始化的时候是不允许其他线程进入的,静态成员变在
//类第一次加载的时候初始化,这里利用jvm保
//证、线程的安全
class Singleton2 {

    private static final Singleton2 INSTANCE = new Singleton2();

    private Singleton2() {
    }

    public static Singleton2 getInstance() {
        return INSTANCE;
    }
}
//线程安全,同步整个方法,每次获取都要去占锁,不优雅,效率较低
class Singleton3 {

    private static Singleton3 singleton3 = null;

    private Singleton3() {
    }

    public static synchronized Singleton3 getInstance() {
        if (singleton3 == null) {
            singleton3 = new Singleton3();
        }
        return singleton3;
    }
}
//静态内部类实现,线程安全,比饿汉试好。推荐
class Singleton4 {

    private static class SingletonHolder {

        private static final Singleton4 INSTANCE = new Singleton4();
    }

    private Singleton4() {
    }

    public static Singleton4 getInstance() {
        return SingletonHolder.INSTANCE;
    }

}
//二次判null 线程安全,优雅效率高。推荐
class Singleton5 {

    private static volatile Singleton5 singleton5 = null;

    private Singleton5() {
    }

    public static Singleton5 getInstance() {
        if (singleton5 == null) {
            synchronized (Singleton5.class) {
                if (singleton5 == null) {
                    return new Singleton5();
                }
            }
        }
        return singleton5;
    }
}
//枚举实现,不太懂,不推荐。
enum Singleton6 {
    INSTANCE;

    //任意方法,调用时使用INSTANCE.方法名
    public void whateverMethod() {
    }
上一篇 下一篇

猜你喜欢

热点阅读