常见的单例模式

饿汉式(线程不安全):

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

懒汉式:

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

大家或许已经注意到<code>synchronized</code>关键字,这使得在多线程的情况下保证单例对象的唯一性。这种方式在一定程度上节约了资源,但是第一次加载时需要及时进行实例化,反应稍慢,而且每次调用<code>getInstance()</code>都会进行同步,造成不必要的同步开销,不建议使用。

DCL方式实现单例(推荐)

public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
 
    public static Singleton getInstance() {
       if(instance == null) {
           synchronized(Singleton.class) {
              if(instance == null) {
                  instance = new Singleton();
              }
           }
       }
 
       return instance;
 
    }
}

DCL方式既实现了需要才初始化单例,又保证了线程安全,且<code>getInstance</code>调用时不立即进行同步锁,避免了不必要的开销。

单例在使用时需要注意:
单例对象如果持有<code>Context</code>,能容易造成内存泄漏,所以在传给单例对象的<code>Context</code>最好是<code>Application Context</code>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.饿汉式 类加载的时候就会初始化,他是线程安全的,但是类加载的时候就初始化这样会预先消耗一部分资源。 2.懒汉式...
    一个番茄柿阅读 1,836评论 1 22
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,533评论 4 34
  • 单例模式是GOF设计模式中最简单的一个,也是最常见的一个,当我们遇到某个类在全局中只应该存在一个实例的时候就需要使...
    meskal阅读 1,336评论 0 1
  • 概述 单例模式是应用最广的模式之一,在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要...
    刘涤生阅读 1,094评论 0 5
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,624评论 1 8

友情链接更多精彩内容