单例模式可以说是我最早接触的一种设计模式(当时还不知道设计模式的时候),等到后来说单例,才知道是一种设计模式,下面谈谈对单例的理解
概念:
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
注释:1.私有构造方法
2.指向自己实例的私有静态引用
3.以自己实例为返回指的静态的公有方法
适用性:
1.每次从getInstance()都能返回一个且唯一一个对象
2.资源共享的情况下,getInstance()必须适用多线程并发访问
3.提高访问性能
分类:
饿汉式和懒汉式
具体应用
饿汉式
<span style="font-size:18px;">public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
} </span>
遇到的问题:假设这样的场景:两个线程并发调用Singleton.getInstance(),假设线程一先判断完instance是否为null,既到if这里。刚刚判断完毕后,JVM将CPU资源切换给线程二,由于线程一还没执行(instance = new SingletonA();),所以instance仍然是空的,因此线程二执行了new Signleton()操作。片刻之后,线程一被重新唤醒,它执行的仍然是new Signleton()操作。所以这种设计的单例模式不能满足第2点需求。
<span style="font-size:18px;">public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
} </span>
用sychronized避免出现线程问题,但是消耗很大,所以,一般java中都是采用饿汉式,c中采用懒汉式
优点:
1.在内存中只有一个对象,节省内存空间
2.避免频繁的创建和销毁对象,提高性能
3.避免对共享资源的多重占用
4.全局访问
在Android中的应用
1.在应用编写的时候的Application
2.日历模块(CalendarDatabaseHelper)、输入法等等系统的应用
3.我用过一个Volley框架访问往来,它的队列就是单例模式RequestQueue requestQueue = BvinApp.getHttpQueue();(我这里用的是Application,其实写成单例更好,符合设计模式. . . . .)这样可以保证程序的周期之内只有一个队列