单例模式(Singleton),也叫单子模式,是一种经常使用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只须要拥有一个全局对象,这样有利于咱们协调系统总体的行为。数据库
好比在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,而后服务进程中的其余对象再经过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。设计模式
一个类能返回对象一个引用(永远是同一个)和一个得到该实例的方法(必须是静态方法,一般使用getInstance这个名称);安全
调用这个方法时,若是类持有的引用不为空就返回这个引用,若是类保持的引用为空就建立该类的实例并将实例的引用赋予该类保持的引用;服务器
将该类的构造函数定义为私有方法,这样其余处的代码就没法经过调用该类的构造函数来实例化该类的对象,只有经过该类提供的静态方法来获得该类的惟一实例。多线程
单例模式在多线程的,应用场合下必须当心使用。若是当惟一实例还没有建立时,有两个线程同时调用建立方法,那么它们同时没有检测到惟一实例的存在,从而同时各自建立了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例惟一的原则。函数
解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会下降效率)。工具
使用时不能用反射模式建立单例,不然会实例化一个新的对象性能
使用懒单例模式时注意线程安全问题spa
饿单例模式和懒单例模式构造方法都是私有的,于是是不能被继承的,有些单例模式能够被继承(如登记式模式)线程
单例模式只容许建立一个对象,所以节省内存,加快对象访问速度,所以对象须要被公用的场合适合使用,如多个模块使用同一个数据源链接对象等等。如:
须要频繁实例化而后销毁的对象。
建立对象时耗时过多或者耗资源过多,但又常常用到的对象。
有状态的工具类对象。
-频繁访问数据库或文件的对象。
如下都是单例模式的经典使用场景:
资源共享的状况下,避免因为资源操做时致使的性能或损耗等。如上述中的日志文件,应用配置。
控制资源的状况下,方便资源之间的互相通讯。如线程池等。