关闭

最佳单例模式

标签: initialization设计模式
593人阅读 评论(0) 收藏 举报
分类:

initialization on demand holder 模式分析

单例模式要求在应用运行的过程中,只有一个类的实例存在。因此,要确保创建过程是线程安全的,同时要兼顾性能。目前了解到做得比较好的,就是这种initialization on demand holder模式(简称holder模式)。holder模式巧妙使用虚拟机的类加载和初始化机制来实现延迟加载和保证创建过程线程安全。
首先看下holder模式:

public class BestSingleton {
    //构造方法一定要设为private
    private BestSingleton(){}

    private static class LazyLolder{
        private  static final BestSingleton INSTANCE = new BestSingleton();
    }

    public static BestSingleton getInstance(){
        return LazyLolder.INSTANCE;
    }
}

然后,分析运行 BestSingleton.getInstance()语句的过程:
1. ClassLoader加载BestSingleton类,并初始化,由于BestSingleton类不存在任何域,初始化看起来没有做任何事。
2. 调用BestSingleton类的getInstance()方法,至此,LazyLolder类的调用第一次出现。因为调用的是一个静态域,因此要执行LazyLolder类的静态初始化。
3. 静态初始化LazyLolder类,也就是对INSTANCE 变量进行初始化,实例化一个BestSingleton类的实例,并赋值给INSTANCE
4. 继续执行getInstance()方法的返回语句。
关键是在第三步,jvm对类的初始化过程是一个串行,单线程的过程,所以不会有并发的问题。

hoader模式失败案例

这个单例模式还是有失败的时候,不过个人觉得很好会遇到吧。在参考3里可以看到失败例子。

jvm类加载和初始化过程简要

jvm第一次用到一个类的时候,如果类还未加载,则找到该类的class文件并加载该类。每个类都对应一个class文件,内部类也是如此。
第一次使用可以分为:

  • 创建一个类的实例,要对实例化
  • 使用用类的静态域或方法,要进行静态初始化

根据不同的使用类型进行不同初始化。

静态初始化:

  1. 对类变量(静态变量)进行初始化
  2. 执行静态初始化语句,也就是static语句块中包含的语句。

静态初始化不会调用类的构造方法,构造方法只有在类实例化的时候才会调用。

实例化

  1. 进行静态初始化
  2. 对实例变量进行初始化
  3. 执行初始化语句块,也就是用{}括起来的语句块
  4. 执行构造方法

参考资料:

  1. Java单例模式的各种写法(Initialization on Demand Holder模式)
  2. 线程安全的单例模式
  3. Initialization-on-demand holder idiom
0
0
查看评论

单例模式的优缺点

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 ...
  • iblade
  • iblade
  • 2016-04-09 20:55
  • 4365

Java单例模式的各种写法和最优写法推荐

话不多说,直接上代码: (1) //只适合单线程环境,懒汉模式 class Singleton{ private static Singleton Instance = null; public Singleton() { } pu...
  • chenbaige
  • chenbaige
  • 2016-05-24 18:55
  • 2856

单例模式的常见高效实践

单例类一般来讲是仅仅只实例化一次的类,它用来代表系统中唯一的组件,当然单例也避免了大量对象的创建,在工程实践中也有很多应用,比如java中的每个类的类对象class、spring框架中广泛使用单例组件、安卓中的EventBus.getDefault()、Volley等等,虽然有时候他们提供了可再次实...
  • lihengjing1968
  • lihengjing1968
  • 2016-03-14 04:27
  • 739

最好的单例

//懒汉式(静态内部类) //这种写法,即解决安全问题,又解决了性能问题 //这个代码,没有浪费一个词 public class Dl{ //1.先声明一个静态内部类 //private 私有的保证别人不能修改 //static 保证全局唯一 private static class ...
  • KeepcalmandCarryon
  • KeepcalmandCarryon
  • 2017-03-27 18:26
  • 99

最优单例模式

直奔主题,单例模式是一种表面简单实则很精妙的一个设计模式,网上有好多写法,什么饿汉懒汉什么多线程多处理器等等乱七八糟,个人觉得一种比较好的写法如下。 public class SingleTon { private SingleTon() { }; private static cla...
  • jijiaxin1989
  • jijiaxin1989
  • 2014-12-15 14:25
  • 2027

最好的单例模式

public class Singleton { private volatile static Singleton singleton; /** * 最好的方法 * @return */ public static Singleton ge...
  • lintcgirl
  • lintcgirl
  • 2015-09-10 16:48
  • 401

eclipse使用技巧 之 一行代码写出最好的单例模式

目的: 为了更好的用好工具,提升开发速度 参考文章: 1.http://www.thinksaas.cn/group/topic/344092/  关于eclipse模板相关。 2.http://www.race604.com/java-double-checked-singleton/ ...
  • xiaxiayige
  • xiaxiayige
  • 2016-03-22 18:37
  • 940

C++ 单例模式最佳实现

C++ Singleton (单例) 模式最优实现 written on Thursday, June 4, 2009 索引 静态化并不是单例 (Singleton) 模式饿汉模式懒汉模式 (堆栈-粗糙版)懒汉模式 (局部静态变量-最佳版)范例代码和注意事项 (最优实现)扩展阅读参...
  • tgxallen
  • tgxallen
  • 2017-05-14 23:00
  • 804

Java中的单例模式的优秀实现

单例模式不得不说应该算初学者接触的最早几个设计模式之一了,主要是因为它的应用场景比起什么其他模式太简单易懂了,我们都知道,你要一个总体控制的类,比如一个能够初始化功能,提供特定功能的Helper类,那你用单例模式实现是非常有用的,而我在这里就要说一说单例模式的优秀实现方式
  • ll530304349
  • ll530304349
  • 2016-09-21 15:25
  • 431

单例模式的几种实现方式

  • 2017-05-05 16:05
  • 22.38MB
  • 下载
    个人资料
    • 访问:191267次
    • 积分:3258
    • 等级:
    • 排名:第12354名
    • 原创:128篇
    • 转载:0篇
    • 译文:4篇
    • 评论:35条
    博客专栏