单例模式

一、概述

单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点
单例模式具有典型的三个特点:

  • 只有一个实例。
  • 自我实例化。
  • 提供全局访问点。

常见的单例模式实现方式有五种:饿汉式、懒汉式、双重检测锁式、静态内部类式和枚举单例。而在这五种方式中饿汉式和懒汉式又最为常见,下面就对饿汉式和懒汉式进行详细分析。

二、代码剖析

1.懒汉式

public class Singleton {
    //2.本类内部创建对象实例
    private static Singleton instance = null;
    // 1.构造方法私有化,外部不能new
    private Singleton() {
 
    }
   //3.提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
 
}

单例模式的懒汉式体现了缓存的思想,延时加载就是一开始不要加载资源或者数据,一直 等,等到马上就要使用这个资源的或者数据了,躲不过去了才去加载。
懒汉式是定性的时间换空间,不加同步的懒汉式是线程不安全的,如何实现线程安全的懒汉式(双重检查加锁):

public class Singleton {
    private volatile static Singleton instance = null; 
    // 私有化构造方法
    private Singleton() {
 
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    } 
}

总而言之,由于该模式是在运行时加载对象的,所以加载类比较快,但是对象的获取速度相对较慢,且线程不安全,如果想要线程安全的话可以加上synchronized关键字,但是这样会付出惨重的效率代价。
2.饿汉式

public class Singleton {
    private static Singleton instance = new Singleton();
    // 私有化构造方法
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}

饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。

三、使用场景

1、任务管理器就是很典型的单例模式,比如不能打开两个windows task manager。
2、(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
3、网站的计数器,一般也是采用单例模式实现,否则难以同步。
4、数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
5、多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

你可能感兴趣的:(java,单例模式)