what
是一种获取实例的方法
确保一个类在任何情况下都绝对只有一个实例
提供一个全局访问点
创建型模型
why
有的对象全局只需要一个,可以重复使用,防止全局使用的类频繁创建与销毁 ,控制实例数量,节省系统资源
how
J2EE
ServletContext
全局应用程序共享对象
全局唯一的域对象
服务器在内存上创建的存储空间
服务器启动时创建 关闭时销毁
在不同动态资源之间传递与共享数据 所有动态资源都可以写入和获取
getServletContext()
工程内所有对象共享
读取全局配置参数
搜索当前工程目录下资源文件
getRealPath(根据相对路径获得绝对路径)
getResourceAsStream(根据相对路径获取服务器上资源的输入字节流)
获取当前工程名字
getContextPath()
共同方法
setAttribute键值对 getAttribute removeAttribute getInitparameter (web.xml中配置) getInitparameterNames
Spring
ApplicationContext 典型饿汉式
ApplicationContext会预先初始化所有的Singleton Bean,于是在系统创建前期会有较大的系统开销,但一旦ApplicationContext初始化完成,程序后面获取Singleton Bean实例时候将有较好的性能。也可以为bean设置lazy-init属性为true,即Spring容器将不会预先初始化该bean。
数据库
连接池
连接池管理类 连接池的外覆类wrapper 系统中只能有一个连接池管理类的实例 管理不同数据库或者同一数据库中的不同用户
私有构造函数 对外提供获取唯一实例的方法
饿汉式
在类加载之前实例化 在线程出现之前 不存在访问安全问题 执行效率高
占用内存 可能浪费内存
懒汉式
实例延迟初始化 双重校验锁 不会多次初始化 可见性 防止重排
注册式(登记式)单例
将每一个实例都登记到某一个地方,使用唯一的标识获取实例。
两种写法
容器缓存
枚举登记
ThreadLocal 线程单例
ThreadLocal 不能保证其创建的对象是全局唯一,但是能保证在单个线程中是唯一的,天生的线程安全。
破坏
反射破坏单例
序列化破坏单例