单例设计模式
1.什么是单例设计模式
单例模式就是用来创建独一无二的,只有一个实例的对象的模式。
2.为什么使用单例模式
有些对象我们只需要一个,如果制造出多个实例,就会产生许多问题。比如程序行为异常,资源使用过度。
3.单例模式实现
分为饿汉模式和懒汉模式
饿汉模式:
package com.tom.singleton; /* * 单例设计模式学习: * 1、设计模式:一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 * 2、目的:可重用代码,让代码更容易被他人理解、保证代码可靠性。 * 3、单例模式:保证整个应用中某个实例有且只有一个。 * 4、举例:配置文件、工具类、线程池、缓存、日志对象等 * 5、饿汉模式,懒汉模式 */ public class SingletonDemo { //构造方法私有化,外界无法直接创建对象 private SingletonDemo(){ } //创建类的唯一实例,private static ,static修饰为类所有,类加载就创立,无论是否需要。 private static SingletonDemo instance = new SingletonDemo(); //提供一个用于获取实例的方法,此方法为实例(对象)方法,不是类方法,添加static public static SingletonDemo getInstance(){ return instance; } }
懒汉模式:
package com.tom.singleton; /* * 懒汉模式 */ public class Singleton { //构造私有 private Singleton(){ } //声明类的唯一实例,试用private,static修饰 private static Singleton instance; //提供一个用于获取实例的方法,使用public static修饰 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
区别:饿汉模式的特点是加载比较慢,但运行时获取对象的速度比较快,线程安全。
懒汉模式的特点是加载快,获取慢,线程不安全。
如何解决饿汉可能造成资源的浪费和懒汉的线程不安全问题?可以利用同步(synchronized)方法,但是同步解决了线程安全问题,随之而来只有第一次需要同步,当已经有创建的实例时,就不需要同步了,所以我们采用双重检查加锁的方法来解决同步的弊端:
这样就能保证只执行一次同步了。private volatile static Singleton instance; //提供一个用于获取实例的方法,使用public static修饰 public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class) { if(instance == null){ instance = new Singleton(); } } } return instance; }