常见的几种java单例模式代码解析

本贴最后更新于 2133 天前,其中的信息可能已经渤澥桑田

单例模式

是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
  单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,复用对象节省资源。

懒汉单例模式实践

/**
 * 
 * @ClassName: singleton
 * @Description: 懒汉单例模式,调用getInstance方法时才创建实例,实现懒加载
 * @author <a href="http://www.wanglay.com">Lei Wang</a>
 * @date 2016-5-6 下午4:46:54
 */
public class Singleton
{
private static Singleton single = null;

/**
 * 私有化构造方法
 * 
 * @author &lt;a href="http://www.wanglay.com"&gt;Lei Wang&lt;/a&gt;
 */
private Singleton()
{

}

/**
 * 
 * @Title: getInstance
 * @Description: 判断是否已经有Singleton实例存在,获得Singleton实例
 * @author &lt;a href="http://www.wanglay.com"&gt;Lei Wang&lt;/a&gt;
 * @return Singleton实例
 * @throws
 */
public static Singleton getInstance()
{

    if (null != single)
    {
        return single;
    }
    else
    {
        single = new  Singleton()
        return single;

    }

}

}

这种是比较常见的单例实现代码,但是以上实现没有考虑线程安全问题。在在并发环境下很可能出现多个Singleton实例。可以用synchronized来解决线程安全问题,但是会牺牲效率。

还可以用静态内部类实现,解决线程安全问题,不会牺牲效率

  /**
         * 
         * @ClassName: LazyHolder
         * @Description: 静态内部类,这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,不同的是staic修饰的变量只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会去装载LazyHolder类,从而实例化instance。
         * @author <a href="http://www.wanglay.com">Lei Wang</a>
         * @date 2016-5-6 下午5:21:46
         */
        private static class LazyHolder
        {
            private static final Singleton INSTANCE = new Singleton();
        }

 

饿汉式单例实践

/**
 * 
 * @ClassName: singleton
 * @Description: TODO(懒汉单例模式.在类加载时实例化自己 )
 * @author <a href="http://www.wanglay.com">Lei Wang</a>
 * @date 2016-5-6 下午4:46:54
 */
public class Singleton
{
    /**
     * 在类加载时实例化对象
     */
    private final static Singleton INSTANCE = new Singleton();
/**
 * 私有化构造方法
 * 
 * @author &lt;a href="http://www.wanglay.com"&gt;Lei Wang&lt;/a&gt;
 */
private Singleton()
{

}

/**
 * 
 * @Title: getInstance
 * @Description: 获得Singleton实例
 * @author &lt;a href="http://www.wanglay.com"&gt;Lei Wang&lt;/a&gt;
 * @return Singleton实例
 * @throws
 */
public static Singleton getInstance()
{
    return INSTANCE;

}

}

 

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 单例模式
    8 引用 • 3 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...