1.单例模式定义
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)
2.单例模式有哪些使用场景
在我们的系统中,有一些对象其实我们只需要一个,比如说:线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象。事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常、资源使用过量、或者不一致性的结果。
3.Java中单例模式的好处
- 频繁使用的对象,可以忽略创建对象花销的时间,降低系统开销
- 系统new对象的此时减少,降低Java程序GC压力,缩短GC时间
4.Java中单例模式的实现方式
- 饿汉式单例类
/**
* @author caishen
* @version 1.0
* @className EagerSingleton
* @date 2019/12/18 11:12
* 自分で書いたコードの各行を担当する
**/
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
}
public static EagerSingleton getInstance(){
return instance;
}
}
饿汉式单例类是存在缺点的,就是无论这个对象后面是否使用,在内存中都会存在这个对象,如果该对象分配了大量资源并且未使用,那么就会对系统性能产生影响 - 饿汉式初始化块单例类
/**
* @author caishen
* @version 1.0
* @className EagerStaticBlockSingleton
* @date 2019/12/18 11:25
* 自分で書いたコードの各行を担当する
**/
public class EagerStaticBlockSingleton {
private EagerStaticBlockSingleton() {
}
private static final EagerStaticBlockSingleton instance;
static {
try {
instance = new EagerStaticBlockSingleton();
} catch (Exception e) {
throw e;
}
}
public static EagerStaticBlockSingleton getInstance() {
return instance;
}
}
问题点和上面一致 - 懒汉式(非线程安全)单例类
/**
* @author caishen
* @version 1.0
* @className LazySingleton
* @date 2019/12/18 11:30
* 自分で書いたコードの各行を担当する
**/
public class LazySingleton {
private LazySingleton() {
}
private static LazySingleton instance;
// 未加锁 非线程安全
public static LazySingleton getInstance() {
if (null == instance) {
instance = new LazySingleton();
}
return ins