暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

单例设计模式 (八种方式)

小何爱学习 2020-03-04
191

点击上面 “蓝字” 关注我们

单例设计模式

什么是单例模式?


单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

注意:

        1、单例类只能有一个实例。

        2、单例类必须自己创建自己的唯一实例。

        3、单例类必须给所有其他对象提供这一实例。


为什么使用单例设计模式?

意图:  

保证一个类仅有一个实例,并提供一个访问它的全局访问点对象

主要解决:

一个全局使用的类频繁地创建与销毁。

何时使用:

当您想控制实例数目,节省系统资源的时候。


单例设计模式8 种方法

  1. 饿汉式(静态常量)

  2. 饿汉式(静态代码块)

  3. 懒汉式(线程不安全)

  4. 懒汉式(线程安全,同步方法)

  5. 懒汉式(线程安全,同步代码块)

  6. 双重检查

  7. 静态内部类

  8. 枚举


单例设计模式具体实现

1 )饿汉式(静态常量)实例

代码实现

优缺点与总结

  1. 优点:这种方式写法简单,在类装载的时候就完成实例化,避免了线程同步问题

  2. 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading 懒加载 的效果,如果从始至终未使用过这个类,则会造成内存的浪费。(懒加载的意思就是什么时候用什么时候才加载

  3. 结论:懒汉式单例设计模式可以用,但是会造成内存的浪费


2 )饿汉式(静态代码块)实例

代码实现  

优缺点与总结

  1. 优缺点与上面一样

  2. 结论:懒汉式单例设计模式可以用,但是会造成内存的浪费


3 )懒汉式(线程不安全)实例

代码实现  


优缺点与总结

  1. 优点:实现了Lazy Loading 懒加载 的效果

  2. 缺点:只能在单线程下使用,如果进入了多线程,if(singletonInstance == null)
    语句还未来得及向下执行,另一个线程也通过了这个判断语句,会导致产生多个实例,因此在严格意义上它并属于单例设计模式。在多线程下不能使用这种方式

  3. 结论:在实际开发中不要使用这种方式。


4 )懒汉式(线程安全 同步方法)实例

代码实现  

优缺点与总结

  1. 优点:解决了线程安全的问题

  2. 缺点:效率太低,每个线程想要执行getInstance()方法时,都要进行同步,实际上这个方法只执行一次实例化就够了,之后就直接return 实例就好了,方法进行同步效率太低

  3. 结论:在实际开发中不推荐这种方式。

5 )懒汉式(线程不安全 同步代码块)实例

有的人也许会认为把上面同步方法换成同步代码块就可以了:如下:


优缺点与总结

  1. 优缺点与 3) 一样

  2. 结论:在实际开发中不要使用这种方式。


6)双重检查 实例

 代码实现  

优缺点与总结

  1. 优点:双重检查(double-check) 概念时多线程开发中经常用到的,在代码中我们进行了两次if(singletonInstance == null)
    判断,解决了线程安全问题

  2. 第一个线程调用完getInstance方法后,其他的线程在第一层判断时,就会直接返回实例,避免反复进入同步代码块,解决了效率问题

  3. 结论:在实际开发中推荐使用这种方式。

7)静态内部类 实例

代码实现  

优缺点与总结

  1. 在Singleton进行装载的时候 其静态内部类SingletonInstance并不进行装载,等到需要实例化时调用getInstance方法时,静态内部类SingletonInstance才进行装载,完成Singleton类的实例化,类的静态属性,只有在第一次装载类的时候进行初始化,JVM帮我们实现了线程的安全性,并实现了懒加载。

  2. 优点:避免了线程的不安全,利用静态类实现延迟加载,效率高。

  3. 结论:在实际开发中推荐使用这种方式。

8 )枚举 实例

代码展示:

优缺点与总结

  1. 这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。

  2. 结论:推荐使用


您看此文用  · 秒,转发只需 1 秒呦~


一起加油

长按关注我们吧!!


星标一下再走呗!




文章转载自小何爱学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论