Java设计模式之单例模式

什么是单例模式?

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。(来自百科,,基本概念不是我要说的)

单例模式的几种实现。

单例模式的实现形式有多种,但从new对象的时机可以分为懒汉式、饿汉式。就是说一个是提前把对象创建出来,一个是等要用的时候再创建对象。接下来的几种实现会标出来属于哪一类。

第一种(懒汉)

public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

这个没啥好说的,私有化构造函数,定义final static的对象,在类加载的时候对象就已经创建完成。

第二种(饿汉)

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个种写法有几个注意的地方。

1,getInstance 的时候先判断==null然后再进入同步代码块,当发生了并发俩个线程都进入了if语句后,为了防止俩个线程先后都进入同步块创建俩个对象,所以需要再次判null,避免第二个线程创建实例。

2,关于volatile的说明我本来想自己写,但是看到这位大佬写的又好又详细所以直接放他的链接

https://blog.csdn.net/chenchaofuck1/article/details/51702129/

从清单4开始下面又为什么要用volatile的详细解释。

第三种(饿汉)

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

这种方法主要是利用了静态内部类,在第一次调用它的时候才会进行加载所以它内部的new Singleton也会在这时候才进行创建。

你可能感兴趣的:(java)