学习java中的单例模式(Singleton)

原创 2016年05月31日 21:41:22

今天也是在学习Android-CleanArchitecture-master的demo(学习这个的框架),在看源码的时候,发现了一个我之前没有看过的引用:import javax.inject.Singleton;。于是googl搜索了一下。


在维基百科有非常简单明了的介绍(官网网址:单例模式),下面把内容复制过来,方便不能看到的同学学习。


维基原文:


单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。


实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。


单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。


构建方式

通常单例模式在Java语言中,有两种构建方式:

  • 懒汉方式。指全局的单例实例在第一次被使用时构建。
  • 饿汉方式。指全局的单例实例在类装载时构建。

例子

Java语言中,单例模式(饿汉模式)应用的例子如下述代码所示:

  public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
  
    // Private constructor suppresses   
    private Singleton() {}
 
    // default public constructor
    public static Singleton getInstance() {
        return INSTANCE;
    }
  }

Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为[1]):

  public class Singleton {
    private static volatile Singleton INSTANCE = null;
  
    // Private constructor suppresses 
    // default public constructor
    private Singleton() {}
  
    //thread safe and performance  promote 
    public static  Singleton getInstance() {
        if(INSTANCE == null){
             synchronized(Singleton.class){
                 //when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again.
                 if(INSTANCE == null){ 
                     INSTANCE = new Singleton();
                  }
              } 
        }
        return INSTANCE;
    }
  }

注:还有其他语言的实现版本,目前只黏贴java版本过来。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java Singleton单例模式

  • 2010年06月21日 09:07
  • 59KB
  • 下载

单例模式Singleton(java源码)

  • 2011年03月30日 21:33
  • 409B
  • 下载

java设计模式学习系列之一:单例模式(Singleton)

Quotes: http://blog.csdn.net/qjyong/archive/2007/08/01/1721342.aspx单例模式(Singleton)     1.介绍:也叫单子模...

Java 单例模式Singleton

  • 2011年01月08日 21:27
  • 1KB
  • 下载

java设计模式学习 ----- 单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。单例模式也分三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有几个好处:...

Java 写一个单例模式(Singleton)出来

第一种:饱汉模式 public class SingleTon {  private SingleTon(){ } //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间 ...
  • zpf336
  • zpf336
  • 2014年09月25日 21:41
  • 6711

java 单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一...

java 单例模式 (Singleton)

概要  单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(c...

Java 单例模式(Singleton Mode)

java模式之单例模式:           单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。  特点:        1,一个类只能有一个实例        2,自...

JAVA单例模式(Singleton)

单例模式主要用于:有一些对象我们只需要一个,比如:线程池、缓存、对话框、处理偏好设置、注册表对象、日志对象以及配置文件对象、数据库连接对象等等。单例模式常用于管理共享资源,例如:数据库连接或者线程池。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习java中的单例模式(Singleton)
举报原因:
原因补充:

(最多只允许输入30个字)