关闭

初学单例模式

标签: singleton
84人阅读 评论(0) 收藏 举报
分类:

单例模式,即同一个类对外只提供一个对象,一般有饿汉式和懒汉式两种。

饿汉式:先实例化一个对象,将构造方法私有,对外只暴露获取该实例的静态方法

public class Singleton{
    private static final Singleton singleton=new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }   
}

懒汉式:一般用于构造函数需要外界传值时使用。

public class Singleton{
    private static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton==null){
            single=new Singleton();
        }
        return singleton;
    }
}

但是懒汉式是线程不安全的,因此需要加上同步锁。

//版本1.0
public synchronized stataic Singleton getInstance(){
    if(singleton==null){
        singleton=new Singleton();
    }
    return singleton;
}

但是这样,每次获得实例都要同步等待,效率低下,因此考虑把synchronized放到方法体内于是有

//版本2.0
public static Singleton getInstance(){
    if(singleton==null){
        synchronized(Singleton.class){
            singleton=new Singleton();
        }
    }
    return singleton();
}

但是这么一来,效率是上去了,但是同步锁却失效了,不同的线程可以进去if(singleton==null)后等待,也会产生线程安全问题,因此最后采取双重锁判断。

//最终版本
public class Singleton{
    privat static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton==null){
            synchronized(Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();
                    }
            }
        }
        return singleton;
    }
}

单例模式在android中使用范围比较广,比如在volley中,为了减少内存的浪费和管理的方便,一般将RequestQueue设计为单例模式以方便对于Request的统一管理。

以上是单例模式的介绍,一般情况下有限考虑饿汉式,因为没有线程安全问题,但是在特殊情况下,如类的构造需要传入一些参数,在android中常见 Context,此时就只能采取懒汉式的方法时。一旦设计线程并发操作,就要特别注意线程安全性问题了。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

设计模式学习笔记---单例模式(Java版)

GOF23(Group of  four) 创建型模式 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。 结构型模式 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-01-09 09:30
  • 1110

【设计模式C++】单例模式

静态变量的内存分配和初始化 全局变量、non-local static变量(文件域的静态变量和类的静态成员变量)在main执行之前的静态初始化过程中分配内存并初始化;local static 变量(局...
  • woxiaohahaa
  • woxiaohahaa
  • 2016-05-09 10:16
  • 1939

Java枚举使用以及枚举实现单例模式

JDK 1.5 之前需要自定义枚举类 JDK 1.5 新增的enum关键字用于定义枚举类 若枚举只有一个成员,则可以作为一种单例模式的实现方式。 枚举类型是指由一组固定的常量组成合法值的类型,枚...
  • u014082714
  • u014082714
  • 2016-08-22 00:24
  • 3698

单例模式---初学 优点--缺点

  • 2009-02-22 19:56
  • 1KB
  • 下载

初学Java,单例模式(十五)

下面的代码是使用Java实现设计模式中的单例模式 01.public class Singleton 02.{ 03. //使用一个变量来缓存曾经创建的实例 04. pr...
  • yancongmin0702
  • yancongmin0702
  • 2014-04-30 11:17
  • 360

java中的单例模式

  • 2017-05-21 22:02
  • 5KB
  • 下载

单例模式SingletonMode

  • 2015-08-04 00:00
  • 10KB
  • 下载

iOS单例模式

  • 2015-08-01 17:34
  • 62KB
  • 下载

单例模式的扩展及其应用

  • 2017-12-03 16:06
  • 38KB
  • 下载

单例模式(Singleton)的6种实现

  • 2017-11-02 11:14
  • 1.17MB
  • 下载
    个人资料
    • 访问:3142次
    • 积分:187
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条