定义
单件模式,确保一个类只有一个实例,并提供一个全局访问点。
为什么会存在这种情况?
有一些对象其实我们只需要一个,比方说,线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者不一致的结果等。
经典单件模式(懒汉式)
- 单线程下有用
- 延迟创建对象,适用于创建对象后,可能会有沉重的负担情况。
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();// 用的时候才创建
}
return instance;
}
}
饿汉式
创建对象,负担不重时可以这么用
public class Singleton{
private static Singleton instance=new Singleton();// 上来就创建实例
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
多线程单件模式:
考虑类多线程情况,给加上类synchronized关键字。
- 但是,同步方法可能造成程序执行效率严重下降,因此在频繁调用的地方需要慎重考虑。
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
双重检查加锁
在上一个基础上,优化了synchronized同步方法。
public class Singleton{
private volatile static Singleton instance;//volatile关键字确保:当instance变量被初始化成单例时,多个线程正确地处理instance变量。
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){// 只有第一次才彻底执行完代码
synchronzed(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
网友评论