java 实现单例模式_X1-1-单例模式

总目录:地址如下看总纲

1、饿汉模式:顾名思义,因为饿了,就勤快

设计思路:实例在初始化的时候就已经建好了,所以类加载较慢,但获取对象的速度快。好处是没有线程安全的问题(基于类加载机制),坏处是浪费内存空间,这时候初始化instance显然没有达到懒加载的效果。

public class Singleton {

private static Singleton instance = new Singleton ( );

private Singleton() {

}

public static Singleton getInstance() {

return instance;

}

}

补充:

b120020e7ea8

image.png

2、懒汉模式(线程不安全)

设计思路:“比较懒”(用的时候才去检查有没有实例,如果有则返回,没有则新建),懒汉模式声明了一个静态对象,在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。

public class Singleton {

private static Singleton instance;

private Singleton() {

}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton ( );

}

return instance;

}

}

3、懒汉模式(线程不安全),加了synchronized 修饰

public class Singleton {

private static Singleton instance;

private Singleton() {

}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton ( );

}

return instance;

}

}

4、双重检查模式 (DCL):资源利用率高

设计思路:

1、此写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。volatile关键字考虑了程序的正确性,但多少会影响性能。

2、某些情况会出现失效的问题,也就是DCL失效,在《java并发编程实践》一书建议用静态内部类单例模式来替代DCL。

public class Singleton {

private volatile static Singleton instance;

private Singleton() {

}

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton ( );

}

}

}

return instance;

}

}

5、静态内部类单例模式

设计思路:

第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。

public class Singleton {

private Singleton() {

}

public static Singleton getInstance() {

return SingletonHolder.sInstance;

}

private static class SingletonHolder {

private static final Singleton sInstance = new Singleton ( );

}

}

6、枚举单例

设计思路:

1、默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。不过上面的五种方式,有一种情况下他们会重新创建对象,那就是反序列化,将一个单例实例对象写到磁盘(或者内存)再读回来,从而获得了一个实例。反序列化操作提供了readResolve方法,这个方法可以让开发人员控制对象的反序列化。在上述的几个方法示例中如果要杜绝单例对象被反序列化是重新生成对象。

public enum Singleton {

INSTANCE;

public void doSomeThing() {

}

}

异常五种防止破坏单例的机制

private Object readResolve() throws ObjectStreamException {

return singleton;

}

补充:

b120020e7ea8

image.png

b120020e7ea8

image.png

参考博客:

//韩顺平的设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值