标签:
1.何为单例模式?
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
2.单例模式的实现方式
一般来说单例设计模式有三个具体的实现方式,分别为懒汉模式,饥汉模式以及双重锁设计模式。
下面我们将要分别介绍它们:
1、懒汉模式
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实 例,则节约内存空间。
java代码实例如下:
package com.yonyou.test; /** * 使用懒汉模式创建一个单例模式 * @author 小浩 * @创建日期 2015-4-4 */ public class Singleton { private static Singleton instance=null; /** * 返回或者创建相关的单例实例 * @return */ public static synchronized Singleton getInstance(){//使用同步方法保证线程安全 if(instance==null){ instance=new Singleton(); } return instance; } /** * 一个私有的构造方法,使外部的对象不能new相关的实例, * 这个尤其要注意,一定要提供默认的私有化的方法去覆盖 * 默认的构造方法 否则的话,如果用户直接去new一个对象 * 的话,就无法保证单例了~~~ */ private Singleton(){} }
咋一看这代码感觉还可以,已经基本实现了单例的设计模式,但是如果我们仔细推敲的话,我们就会发现问题所在。
在代码
public static synchronized Singleton getInstance(){//使用同步方法保证线程安全
这里我们看到,每次获取单例的时候都会加入同步锁,这样的话势必会造成访问性能的问题。
为了更好的解决这个问题,我们可以修改加入同步锁的位置,请看下面的代码:
package com.yonyou.test; /** * 使用懒汉模式创建一个单例模式 * @author 小浩 * @创建日期 2015-4-4 */ public class Singleton { private static Singleton instance=null; /** * 返回或者创建相关的单例实例 * @return */ public static Singleton getInstance(){ if(instance==null) { //加入同步代码块,这样可以有效的处理并发下访问问题 synchronized(Singleton.class){ if(instance==null){ instance=new Singleton(); } } } return instance; } /** * 一个私有的构造方法,使外部的对象不能new相关的实例, * 这个尤其要注意,一定要提供默认的私有化的方法去覆盖 * 默认的构造方法 否则的话,如果用户直接去new一个对象 * 的话,就无法保证单例了~~~ */ private Singleton(){} }
此外还有一个比较给力的实现单例的方式,推荐大家使用这种方式:
package com.yonyou.test; /** * 使用懒汉模式创建一个单例模式 * @author 小浩 * @创建日期 2015-4-4 */ public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。 */ static class SingletonHolder { /** * 静态初始化器,由JVM来保证线程安全 */ static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } /** * 一个私有的构造方法,使外部的对象不能new相关的实例, * 这个尤其要注意,一定要提供默认的私有化的方法去覆盖 * 默认的构造方法 否则的话,如果用户直接去new一个对象 * 的话,就无法保证单例了~~~ */ private Singleton(){} }
3.饿汉的设计模式
在初始化类的过程中就会完成相关实例的初始化,一般认为这种方式要更加安全些,饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
Java代码实例如下:
package com.yonyou.test; /** * 使用饥汉模式创建一个单例模式 * @author 小浩 * @创建日期 2015-4-4 */ public class Singleton { //在加载类的时候就初始化Singleton实例 private final static Singleton instance=new Singleton(); /** * 返回或者创建相关的单例实例 * @return */ public static Singleton getInstance(){ return instance; } /** * 一个私有的构造方法,使外部的对象不能new相关的实例, * 这个尤其要注意,一定要提供默认的私有化的方法去覆盖 * 默认的构造方法 否则的话,如果用户直接去new一个对象 * 的话,就无法保证单例了~~~ */ private Singleton(){} }
标签:
原文地址:http://www.cnblogs.com/xiohao/p/4391724.html