23种设计模式之单例模式

单例模式可以说是我最早接触的一种设计模式(当时还不知道设计模式的时候),等到后来说单例,才知道是一种设计模式,下面谈谈对单例的理解

概念:

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例


注释: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,其实写成单例更好,符合设计模式. . . . .)这样可以保证程序的周期之内只有一个队列





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值