目录
前言
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。之前也写过相关博文:设计模式:3、单例模式
一、简单示例
1、定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2、示例
public class Singleton {
private static Singleton instance = new Singleton;
private Singleton () {
}
public static Singleton getInstance() {
return instance;
}
}
上面就是一个单例模式的简单使用示例,可以看到确实是自行实例化的,并且使用的是私有构造函数,
目的是为了其他地方不能通过构造函数来创建该类的实例,只能通过公共的 getInstance() 方法获取该类的实例
二、Java版
2.1 饿汉式(线程安全)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
小结:
在类加载的时候就初始化实例,虽然避免了多线程并发操作导致的线程安全问题,
但是会造成内存的浪费,因为还没有使用这个对象就把它加载到内存中了。
2.2 懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
小结:
只有第一次用到的时候才初始化实例,解决了饿汉式造成内存浪费的问题,但是多线程的时候是不安全的。
例如有线程 A 与线程 B 同时执行,这时候就有可能 2 个线程都同时执行到 if (instance == null),这样就创建了 2 个实例了,
所以这种方式只适用于单线程。详细的多线程并发可以参看文章 带你通俗易懂的理解——线程、多线程与线程池 。(https://www.jianshu.com/p/fd7d30aa451b)
2.3 懒汉式(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton() {
}