资讯专栏INFORMATION COLUMN

singleton 单例模式

DirtyMind / 1383人阅读

摘要:单例模式单例模式是中最常用的设计模式,也是面试中经常考察的。因为类加载的时候是单线程,保证单例和线程安全。生成了一个实例延迟初始化实例,但是为了保证线程安全,需要加锁。

singleton 单例模式

单例模式是Java 中最常用的设计模式,也是面试中经常考察的。

标准版本

<图解设计模式> 书本上的示例代码,在class内有一个静态的变量直接赋值,在类加载的时候就初始化。缺点是有点浪费内存。因为类加载的时候是单线程,保证单例和线程安全。

public class Singleton1 {
      private static Singleton1 singleton1 = new Singleton1();
      private Singleton1() {
            System.out.println("生成了一个实例.");
      }
      public static Singleton1 getInstance() {
            return singleton1;
      }
}
synchronized

延迟初始化实例,但是为了保证线程安全,getInstance需要加锁。

public class Singleton2 {
      private static Singleton2 singleton2 = null;
      private Singleton2() {
            System.out.println("生成了一个实例.");
      }
      public static synchronized Singleton2 getInstance() {
            if (singleton2 == null){
                  singleton2 = new Singleton2();
            }
            return singleton2;
      }
}
双重校验

在方法上加锁synchronized,效率比较低,为了提高效率在getInstance方法内部加锁。锁住的代码范围越小,所等待的时间越少。

public class Singleton3 {
    private static Singleton3 instance = null;
    private Singleton3() {
        System.out.println("生成了一个实例.");
    }
    public static Singleton3 getInstance() {
        if (instance == null){
            synchronized (Singleton3.class){
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}
利用静态内部类

这种方式同样利用了 classloder 机制来保证初始化 instance 时只有一个线程,它跟标准版本不同的是:标准版本只要 Singleton 类被装载了,那么 instance 就会被实例化(没有达到 lazy loading 效果),而这种方式是 Singleton 类被装载了,instance 不一定被初始化。因为 SingletonHolder 类没有被主动使用,只有显示通过调用 getInstance 方法时,才会显示装载 SingletonHolder 类,从而实例化 instance。想象一下,如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化 instance 显然是不合适的。这个时候,这种方式相比标准版本就显得很合理。

public class Singleton4 {
    private static class SingletonHolder {
        private static final Singleton4 INSTANCE = new Singleton4();
    }
    private Singleton4 (){}
    public static final Singleton4 getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67216.html

相关文章

  • Java设计模式-单例模式Singleton Pattern)

    摘要:如果需要防范这种攻击,请修改构造函数,使其在被要求创建第二个实例时抛出异常。单例模式与单一职责原则有冲突。源码地址参考文献设计模式之禅 定义 单例模式是一个比较简单的模式,其定义如下: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 或者 Ensure a class has only one instance, and provide a global point of ac...

    k00baa 评论0 收藏0
  • Java 设计模式单例模式

    摘要:在设计模式一书中,将单例模式称作单件模式。通过关键字,来保证不会同时有两个线程进入该方法的实例对象改善多线程问题为了符合大多数程序,很明显地,我们需要确保单例模式能在多线程的情况下正常工作。 在《Head First 设计模式》一书中,将单例模式称作单件模式。这里为了适应大环境,把它称之为大家更熟悉的单例模式。 一、了解单例模式 1.1 什么是单例模式 单例模式确保一个类只有一个实例,...

    everfight 评论0 收藏0
  • Android中的设计模式单例模式

    摘要:总结单例是运用频率很高的模式,因为客户端没有高并发的情况,选择哪种方式并不会有太大的影响,出于效率考虑,推荐使用和静态内部类实现单例模式。 单例模式介绍 单例模式是应用最广的模式之一,也可能是很多人唯一会使用的设计模式。在应用单例模式时,单例对象的类必须保证只用一个实例存在。许多时候整个系统只需要一个全局对象,这样有利于我么能协调整个系统整体的行为。 单例模式的使用场景 确保某个类有且...

    罗志环 评论0 收藏0
  • Android中的设计模式单例模式

    摘要:总结单例是运用频率很高的模式,因为客户端没有高并发的情况,选择哪种方式并不会有太大的影响,出于效率考虑,推荐使用和静态内部类实现单例模式。 单例模式介绍 单例模式是应用最广的模式之一,也可能是很多人唯一会使用的设计模式。在应用单例模式时,单例对象的类必须保证只用一个实例存在。许多时候整个系统只需要一个全局对象,这样有利于我么能协调整个系统整体的行为。 单例模式的使用场景 确保某个类有且...

    yzd 评论0 收藏0
  • 设计模式--单例模式

    摘要:双重检查锁单例模式懒汉单例模式中,我们并不需要整个方法都是同步的,我们只需要确保再创建的时候,进行同步即可。单例模式的缺点优点在开头已经说明了,单例模式的缺点在于它一般没有接口,扩展困难,基本上修改源代码是扩展单例模式的唯一方法。 单例模式 定义: 确保某一个类只有一个实例对象,并且该对象是自行实例化的,通过统一的接口向整个系统提供这个实例对象。 使用场景: 避免产生多个对象消耗过多的...

    leanote 评论0 收藏0
  • 设计模式--单例模式

    摘要:双重检查锁单例模式懒汉单例模式中,我们并不需要整个方法都是同步的,我们只需要确保再创建的时候,进行同步即可。单例模式的缺点优点在开头已经说明了,单例模式的缺点在于它一般没有接口,扩展困难,基本上修改源代码是扩展单例模式的唯一方法。 单例模式 定义: 确保某一个类只有一个实例对象,并且该对象是自行实例化的,通过统一的接口向整个系统提供这个实例对象。 使用场景: 避免产生多个对象消耗过多的...

    luxixing 评论0 收藏0

发表评论

0条评论

DirtyMind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<