定义
保证一个类只有一个实例,并提供一个访问它的全局访问点。
使用场景
- 整个项目需要一个共享访问点或数据
- 创建一个对象需要消耗的资源过多,比如访问I/0或者数据库等资源
- 工具类对象
示例
1. 饿汉式
public class SingleInstance {
/**
* 饿汉式
* 线程:安全
* 优点:基于类加载机制,获取对象快
* 缺点:由于在加载中就完成实例化,如果未使用这个实例,会造成内存浪费
*/
private static SingleInstance mSingleInstance = new SingleInstance();
private SingleInstance() {
}
public static SingleInstance getInstance() {
return mSingleInstance;
}
}
2. 懒汉式
public class SingleInstance {
/**
* 懒汉式
* 线程:不安全
* 优点:节约内存资源,只有第一次调用才会实例化
* 缺点:第一次加载相对饿汉式慢一些,并且多线程可能无法正常工作
*/
private static SingleInstance mSingleInstance = null;
private SingleInstance() {
}
public static SingleInstance getInstance() {
if (mSingleInstance == null) {
mSingleInstance = new SingleInstance();
}
return mSingleInstance;
}
}
3. 双重检查模式
public class SingleInstance {
/**
* 双重检查模式
* 线程:安全
* 优点:资源利用率高,只有第一次使用才会实例化
* 缺点:第一次加载稍慢
*/
private static volatile SingleInstance mSingleInstance = null;
private SingleInstance() {
}
public static SingleInstance getInstance() {
if (mSingleInstance == null) {
synchronized (SingleInstance.class) {
if (mSingleInstance == null) {
mSingleInstance = new SingleInstance();
}
}
}
return mSingleInstance;
}
}
4. 静态内部类单例模式
public class SingleInstance {
/**
* 静态内部类
* 线程:安全
* 优点:在保证线程安全的同时,基本没有性能损耗
* 推荐使用静态内部类做单例
*/
private SingleInstance() {
}
public static SingleInstance getInstance() {
return SingleInstanceHolder.sSingleInstance;
}
private static class SingleInstanceHolder {
private static final SingleInstance sSingleInstance = new SingleInstance();
}
}