1: 什么是单例模式

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

设计模式之【单例模式】_初始化


2: 单例模式的应用场景

  • 需要生成唯一序列的环境
  • 需要频繁实例化然后销毁的对象
  • 创建对象时候耗时或者资源过多,但是又经常使用的对象
  • 方便资源相互通信的环境

3: 单例模式的优缺点

 优点

  • 在内存中只有一个对象,节省内存空间
  • 避免​ 频繁的创建销毁对象,可以提高性能
  • 避免对共享资源的多重占用,简化访问
  • 为整个系统提供一个全局访问点
缺点​
  • 不适用频繁变化的对象
  • 如果实例化对象长时间不被利用,系统会认为该对象是垃圾,会被回收,导致对象丢失​
  • 没有接口,不能继承

4: 单例模式实现方式​

1: 懒汉模式 线程不安全

是懒加载,实现比较容易

public class Singleton {  

private static Singleton instance;

private Singleton (){}

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

2: 懒汉式 线程安全

   是懒加载,线程安全,优点:第一次调用才初始化,避免内存浪费。缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率 getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)

public class Singleton {  

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

3: 饿汉式 线程安全

 不是懒加载,优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。


public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}

4: 双检锁/双重校验锁

 是懒加载,线程安全。这种方式采用双锁机制,安全且在多线程情况下能保持高性能。​getInstance() 的性能对应用程序很关键。

public class Singleton {  
private volatile static Singleton singleton;
private Singleton (){}

public static Singleton getSingleton() {
if (singleton == null) {
//加锁
synchronized (Singleton.class) {
//获得锁之后,进行二次判断
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5: 静态内部类

是懒加载,线程安全,实现容易。这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

public class Singleton {  

//静态内部类
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}

private Singleton (){}

public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

好了,以上就是单例模式的所有内容,如有不足,请多多指教。谢谢大家阅读。​