设计模式-创建者模式-单例模式

零、 本文纲要

  • 一、 单例模式
  1. 饿汉式
    ① 静态变量方式
    ② 静态代码块
    ③ 枚举
  2. 懒汉式
    ① 静态方法(线程不安全)
    ② 静态synchronized方法(线程安全)
    ③ 静态方法双检锁(线程不安全)
    ④ 静态方法双检锁volatile优化(线程安全)
    ⑤ 静态内部类(线程安全)
  • 二、 单例模式问题解决
  1. 防止序列化破坏单例
  2. 防止反射破坏单例
  • 三、 JDK中存在的单例模式

java.lang.Runtime类

一、 单例模式

1. 饿汉式

  • ① 静态变量方式

Ⅰ 私有构造private Singleton() {}

Ⅱ 静态变量private static Singleton instance = new Singleton();

Ⅲ 静态方法获取单例public static Singleton getInstance() { return instance; }

/**
 * 饿汉式
 * 静态变量创建类的对象
 */
public class Singleton {
    //私有构造方法
    private Singleton() {}

    //在成员位置创建该类的对象
    private static Singleton instance = new Singleton();

    //对外提供静态方法获取该对象
    public static Singleton getInstance() {
        return instance;
    }
}
  • ② 静态代码块

Ⅰ 私有构造

Ⅱ 静态变量

Ⅲ 静态代码块赋值

Ⅳ 静态方法获取对象

/**
 * 饿汉式
 * 在静态代码块中创建该类对象
 */
public class Singleton {

    //私有构造方法
    private Singleton() {}

    //在成员位置创建该类的对象
    private static Singleton instance;

    static {
        instance = new Singleton();
    }

    //对外提供静态方法获取该对象
    public static Singleton getInstance() {
        return instance;
    }
}
  • ③ 枚举

/**
 * 枚举方式
 */
public enum Singleton {
    INSTANCE;
}

2. 懒汉式

  • ① 静态方法(线程不安全)

/**
 * 懒汉式
 * 线程不安全
 */
public class Singleton {
    //私有构造方法
    private Singleton() {}

    //在成员位置创建该类的对象
    private static Singleton instance;

    //对外提供静态方法获取该对象
    public static Singleton getInstance() {

        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

存在问题:

Ⅰ 多线程下单例难以保证

sequenceDiagram
participant t1 as Thread1
participant t2 as Thread2
t1->t1:instance == null
t1->>+t2:Thread1时间片耗尽,Thread2使用CPU
t2->t2:instance == null<br>instance = new Singleton()<br>return instance
t2->>-t1:Thread2使用完CPU,Thread1分配使用
t1->t1:instance = new Singleton()<br>return instance



作者:石头耳东
链接:https://www.jianshu.com/p/054a20cee6ce
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值