单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。在实际开发过程中,我们常常需要保存一些数据实现全局共享,这时候就需要用到单例模式。单例模式是在实际开发过程中使用比较多的一种设计模式。
应用场景
- 需要生成唯一序列的环境
- 需要频繁实例化然后销毁的对象
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象
- 方便资源相互通信的环境
对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。而在Android应用开发中,常常需要继承系统Application实现自定义的MyApplication功能,这个也是典型的单例模式应用。
Java中的几种实现方式
1.饿汉式
其主要特点是:线程安全,调用效率高,但是不能延时加载
public class SingleInstance {
private static SingleInstance instance = new SingleInstance();
private SingleInstance(){}
public static SingleInstancegetInstance(){
return instance;
}
}
这种开始把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式。但这种方式启动时即创建实例,启动慢,有可能造成资源浪费。
2.懒汉式-线程安全
主要特点:线程安全,调用效率不高,但是能延时加载
public class SingleInstance {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingleInstanceinstance;
//构造器私有化
private SingleInstance(){}
//方法同步,调用效率低
public static synchronized SingleInstancegetInstance(){
if(instance == null){
instance = new SingleInstance();
}
return instance;
}
}
3.懒汉式-非线程安全
主要特点:懒加载启动快,资源占用小,使用时才实例化,无锁,但其为非线程安全
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
4.双重锁机制
主要特点:懒加载,线程安全。
public class Singleton {
private volatile static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
5.Holder模式
主要特点:将懒加载和线程安全完美结合的一种方式,无锁,推荐这种写法。
public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
网友评论