单例模式的作用:保证一个类只能产生一个实例,减少内存开销,屏蔽对象创建的复杂度。
单例模式编码的核心:
*构造方法私有化,避免直接创建对象
*单例类中包含一个静态实例
*包含一个静态方法返回,切返回值为单例类的实例(类的静态实例)
单例的几种实现及优缺点说明:
1.饿汉式
/*单例模式:饿汉式
* */
public class SingleInstance {
private static final SingleInstance instance = new SingleInstance();
private SingleInstance(){
}
public static SingleInstance getInstance(){
return instance;
}
}
优点:写法简单,不存在多线程同步问题。
缺点:单例随着类的加载而初始化,但可能出现单例产生之后,一直未被使用却一直占用内存,直到程序结束的情况。
2.懒汉式
public class SingleInstance{
private static SingleInstance mInstance;
private SingleInstance(){
}
synchronized public static SingleInstance getInstance(){
if(mInstance == null){
mInstance = new SingleInstance();
}
return mInstance;
}
}
优点:只在需要的时候产生单例模式,一些场景下节约内存
缺点:对类的静态方法用同步synchronized,同步方法调用时效率低。
3.懒汉式优化版
public class SingleInstance{
private static SingleInstance mInstance;
private SingleInstance(){
}
synchronized public static SingleInstance getInstance(){
if(mInstance == null){
synchronized (SingleInstance.class) {
if(mInstance == null){
mInstance = new SingleInstance();
}
}
}
return mInstance;
}
优点:同步方法改为同步代码块,同步方法调用时提高效率。
4.最佳实现方法
public class SingleInstance{
private SingleInstance(){
}
public static SingleInstance getInstance(){
return SingleInstanceClass.instance;
}
private static class SingleInstanceClass{
private static SingleInstance instance = new SingleInstance();
}
}
优点:内存占用低,线程同步效率高,线程安全(原因未查明)。