单例模式的介绍

    xiaoxiao2021-03-25  123

    单例模式的介绍

    单例的介绍

    在项目的过程中存在着这样特点的一些类,频繁使用的对象,比如网站的访问记数器,数据库的连接池,线程池等等方面只允许拥有一个对象,允许拥有一个实例。这样的情况下会用到单例。

    单例模式的好处

    (1). 对于频繁使用的对象,可以省略创建对象所花费的时间,减少系统的开销

    (2). 由于new操作的次数减少,因而对系统内存的使用频率也会降低,减轻GC压力,缩短GC停顿时间

    单例模式的几种写法

    3.1最简单的单例模式(俗称懒汉式)

    /** * * @ClassName: Singleton * @Description: TODO(最简单的单例模式) * @author sen * @date 2017年3月9日 * */ public class Singleton { //1.私有构造 private Singleton(){ System.out.println("Hi Singleton"); } //2.私有实例化对象,在JVM加载类的时候,因为是static的,所以也会被创建, 而我们不知道会不会用到这个类 private static Singleton instance = new Singleton(); //3.提供一个公有的方法 public static Singleton getInstance(){ return instance; } //此单例的坏处:如果单例创建的过程十分缓慢,这个单例类中还有其他方法来 供调用,在使用这个类的方法的情况下都会初始化单例类的变量,而不管你是否 用到单例 //举例.如果其他类函数中调用到sayHello,但我们没有使用到单例类,他还是会被创建出来 public static void sayHello(){ System.out.println("Say Hello"); } //如果单例创建过程十分缓慢,但是我们在调用sayHello方法的`这里写代码片`时候不需要使用到单例,这样就会有额外的负载 //为了提高系统在相关函数中调用的速度,就需要加入延迟加载机制 //延迟加载解释:当真正用到的时候才真正执行数据加载操作 }

    3.2 延迟加载的单例模式(懒汉升级版)

    /** * * @ClassName: LazySingleton * @Description: TODO(延迟加载的单例模式) * @author sen * @date 2017年3月9日 * */ public class LazySingleton { //1.私有构造 private LazySingleton(){ System.out.println("Hi Singleton"); } //2.把对象设置为null,确保系统在启动的时候没有额外的负载,只有当触发的情况下才会使用到此变量 private static LazySingleton instance = null; //3.设置一个同步机制,避免多线程下使用单例创建多个,如果存在对象则返回不存在则创建 public static synchronized LazySingleton getInstance(){ if(instance==null){ instance = new LazySingleton(); } return instance; } //此单例的缺点,加入了synchronized关键字,所以在多个线程使用单例的时候会非常缓慢,性能较低 }

    3.3使用内部类的单例模式

    /** * * @ClassName: StaticSingleton * @Description: TODO(单例模式) * @author sen * @date 2017年3月9日 * */ public class StaticSingleton { //1.私有构造 private StaticSingleton(){ System.out.println("Hi Singleton"); } //2.创建一个内部类来实例化构造方法 private static class SingletonHolder{ private static StaticSingleton instance = new StaticSingleton(); } //3.对外提供了一个公有的方法 public static StaticSingleton getInstace(){ return SingletonHolder.instance; } //此单例模式的优点:当单例被加载的时候,其内部类不会被初始化,确保jvm加载完单例类但并没有实例化,只有调取getInstace方法的时候 //才会加载内部类,从而初始化instance //总结:使用内部类来实现单例,既可以做到延迟加载,也不必使用同步关键字,是一种比较完善的实现方式 }
    转载请注明原文地址: https://ju.6miu.com/read-12243.html

    最新回复(0)