Android设计模式之单例模式详解
单例模式
一个类只有一个实例,并且可以全局访问使用
应用场景
如账户管理类,数据库操作类等(某个对象频繁被访问使用)
常用方式
饿汉式
懒汉式
同步加锁
DCL双重加锁验证
静态内部类
枚举单例
饿汉式
加载类的同时立即进行初始化操作,对资源消耗很大
publicclassSingleTest{
publicstaticfinalSingleTestsingleTest1=newSingleTest();
publicSingleTest(){
}
publicstaticSingleTestgetSingleTest1(){
returnsingleTest1;
}
}
懒汉式
优点:需要使用时候才进行初始化加载
缺点:线程不安全,在多线程中很容易出现不同步的情况
publicclassSingleTest1{
privatestaticSingleTest1instance=null;
publicSingleTest1(){
}
publicstaticSingleTest1getInstance(){
if(instance==null){
instance=newSingleTest1();
}
returninstance;
}
}
同步加锁
优点:解决线程安全问题
缺点:每次实例需要判断加锁状态,效率低下
publicclassSingleTest2{
privatestaticSingleTest2instance=null;
publicSingleTest2(){
}
publicstaticsynchronizedSingleTest2getInstance(){
if(instance==null){
instance=newSingleTest2();
}
returninstance;
}
}
DCL双重校验
优点:并发不高的情况下可以完美运行(推荐使用,客户端几乎不存在高并发情况)
缺点:JDK1.5以前可能会出现instance为初始化的问题(现在的Android几乎都是1.71.8了几乎可以略率此问题)
publicclassSingleTest4{
privatestaticSingleTest4instance=null;//静态变量
publicSingleTest4(){
}
publicstaticSingleTest4getInstance(){
if(instance==null){//第一层校验
synchronized(SingleTest4.class){
if(instance==null){//第二层校验
instance=newSingleTest4();
}
}
}
returninstance;
}
}
静态内部类
优点:延迟加载,线程安全,内存消耗少(推荐使用)
publicclassSingleTest5{
privateSingleTest5(){
}
publicstaticfinalSingleTest5getInstance(){
returnSingletonHolder.INSTANCE;
}
//定义的静态内部类
privatestaticclassSingletonHolder{
privatestaticfinalSingleTest5INSTANCE=newSingleTest5();//创建实例的地方
}
}
枚举单例
优点:线程安全,防反序列化,防反射,写法简单
publicenumSingleTest6{
//第一种方式
//INSTANCE;
//privateCaiPiaoinstance;
//
//SingleTest6(){
//instance=newCaiPiao();
//}
//
//publicCaiPiaogetInstance(){
//returninstance;
//}
//
//classCaiPiao{
//
//}
//第二种方式
INSTANCE2{
@Override
protectedvoidCaiPiao(){
System.out.println("彩票");
}
};
protectedabstractvoidCaiPiao();
}
github代码地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。