赞
踩
单例模式是一种常见的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
一、定义与核心概念
单例模式的主要目的是限制一个类的实例化次数,只允许创建一个对象。这样可以在整个应用程序中共享同一个实例,从而减少资源消耗、提高性能,并方便对共享资源的管理和控制。
例如,在一个操作系统中,打印机的驱动程序通常可以设计为单例模式。因为在整个系统中,只需要一个打印机驱动程序的实例来管理与打印机的通信和操作,多个应用程序可以共享这个实例来进行打印任务,避免了为每个应用程序都创建一个独立的驱动程序实例所带来的资源浪费。
二、实现方式
懒汉式单例:
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
getInstance()
方法在第一次调用时会检查instance
是否为null
,如果是,则创建一个新的LazySingleton
实例并返回;如果不是,则直接返回已经创建的实例。getInstance()
方法并且instance
为null
,那么可能会创建多个实例。为了解决这个问题,可以使用同步机制来确保线程安全。饿汉式单例:
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
instance
在类加载时就被创建并初始化,后续的getInstance()
方法只是简单地返回这个已经创建好的实例。双重检查锁(Double-Checked Locking)单例:
getInstance()
方法中使用两次检查instance
是否为null
的方式,减少了同步的开销。public class DoubleCheckedLockingSingleton { private static DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } }
instance
是否为null
是在没有进入同步块之前进行的,如果instance
不为null
,则直接返回实例,避免了不必要的同步开销。如果instance
为null
,则进入同步块,在同步块内再次检查instance
是否为null
,以确保在多线程环境下只有一个线程能够创建实例。三、应用场景
资源管理:
全局配置管理:
日志系统:
四、优缺点
优点:
缺点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。