欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式(Singleton)的创建

程序员文章站 2022-07-14 09:25:21
...

单例模式

饿汉模式
懒汉模式
序列化

单例模式:一个类重点内容中带有一个实例,该实例通过单例类提供给全局使用。

建一个单例模式的类的通用步骤:

  1. 创建一个类
  2. 编写一个类实例
  3. 编写无参构造器并用private修饰
  4. 编写获取实例的方法getInstance()

/**
* 饿汉模式
* 实例在类加载的时候就创建
*/

class Singleton01 {
    private static Singleton01 obj= new Singleton01();
    private Singleton01(){}

    public static Singleton01 getInstance() {
        return obj;
    }
}

/**
* 懒汉模式–线程不安全
* 下面代码,在多线程中存在非线程安全
* 假设线程一在创建Singleton02对象,而 obj = new Singleton02();不是一个原子操作
* 可以分为 jvm根据构造方法在栈区生成对应的对象,然后obj指向该对象的内存地址
* 所以可能存在另外一个线程在obj = new Singleton02();期间在new一个对象出来
*/

class Singleton02 {
    private static Singleton02 obj = null;
    private Singleton02() {}
    public static Singleton02 getInstance() {
        if(obj==null) {
            obj = new Singleton02();
        }
        return obj;
    }
}

/**
 * 懒汉模式--线程安全
 * 同步方法 可以达到线程安全,但是效率会变慢
 */
class Singleton03 {
    private static Singleton03 obj = null;
    private Singleton03(){}
    public synchronized static Singleton03 getInstance() {
        if(obj==null) {
            obj = new Singleton03();
        }
        return obj;
    }
}

/**
 * 懒汉模式--线程安全-DCL(Double Check Lock)
 * 权衡性能和安全
 * 并且使用volatile关键字修饰obj
 * volatile作用:
 * 提高被修饰对象在多个线程中的可见性
 * 禁止指令重新排序
 */

class Singleton04 {
    private static volatile Singleton04 obj = null;
    private Singleton04() {}
    public static Singleton04 getInstance() {
        if(obj==null){
            synchronized (Singleton04.class) {
                if(obj==null)
                obj = new Singleton04();
            }
        }
        return obj;
    }
}

/**
* 反序列化的单例模式
* 加入readResolve()方法读取“假”的实例 达到单例的作用
*/

class Singleton05 implements Serializable {
    private static volatile Singleton05 obj = new Singleton05();
    private Singleton05(){}
    public static Singleton05 getInstance() {
        return obj;
    }

    protected Object readResolve() throws ObjectStreamException{
        return obj;
    }
}

有什么错漏请各位指出,虚心学习,谢谢。