原理:
字面意义:
一个类只有一个对象,仅提供一个全局访问点。
其它类似解决方案:
1.静态变量
2.程序员间协商全局变量
特点:
a.单例类只能有一个实例。
b.单例类必须自己创建自己的唯一实例。
c.单例类必须给所有其他对象提供这一实例。
c.单例类必须给所有其他对象提供这一实例。
应用:
登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的。
代码略
1. Windows的Task Manager(任务管理器)就是很典型的单例模式,只能打开一个。
2. windows的Recycle Bin(回收站)也是典型的单例应用。
3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
4. Web应用的配置对象的读取。这个是由于配置文件是共享的资源。
5. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使 用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵 的,因为何用单例模式来维护,就可以大大降低这种损耗。
6. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
7. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
单例模式三种实现方式:
1.第一种形式: 饿汉式单例类(类加载时就初始化)
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
2.
第二种形式:懒汉式单例类 (调用时初始化)
<span style="font-size:18px;">public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)instance=new Singleton();
return instance;
}</span>
3.登记式单例类 登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的。
代码略
优化:
对多线程问题的解决
1.同步锁
在访问点方法上加synchronized,消耗资源
2.静态对象直接赋值(饿汉模式)
浪费了内存
3.双重检查加锁法
在实例对象前家关键字(volatile)
<span style="font-size:18px;">if(instance != null){
synchronized(Single.class){
if(instance != null){
instance = new Single();
}
}
return instance;
}</span>