>

五种方法实现Java的Singleton单例模式

- 编辑:金沙国际平台登录 -

五种方法实现Java的Singleton单例模式

Singleton形式主要成效是保障在Java应用程序中,三个类Class唯有三个实例存在。

多样艺术落成Java的Singleton单例情势,种种javasingleton

面试的时候日常会问到Java的单例情势,那道题能很好的体察候选人对知识点的接头程度。单例格局要求在系统运维时,只存在独一的贰个实例对象。

上边大家来详细分析一下内部的第一知识点,并介绍三种实现情势,以及它们的得失。

一、最简便的方法是在类加载的时候早先化那几个独立的实例。

首先,定义单例类(未有特意的,正是起个名字):

1 public class Singleton{

其次,供给定义类变量将单例对象保存下去:

1 private static Singleton instance = new Singleton();

此处须要小心两点:

  1. private:除了Singleton类内部,别的地点不能访谈该变量;

  2. static:确定保障是静态类变量,那样能够通过类名来访谈,无须实例;

再次,须求显式定义构造函数,并将其安装为private,那样在Singleton类之外new的话编写翻译器就能够报错,就算是Singleton的子类也极度:

1 private Singleton() {}

最后,定义单例对象的获取格局,

1 public static Singleton getInstance() {
2     return instance;
3 }

 

一律需求专一:

  1. public:那样表面技巧调用;

  2. static:那样表面技巧通过类名来访问,不然获取不到单例对象;

二、使用懒加载。在章程一的底子上,我们要求修改几处代码:

首先,静态类变量应该初露化为NULL:

1 private static Singleton instance = NULL;

其次,getInstance()方法需求担负生成实例的天职:

1 public static Singleton getInstance() {
2     if(instance == NULL)
3         instance = new Singleton();
4     return instance;
5 }

三、考虑多线程的主题材料。措施二在二十四线程情形下还是有非常的大希望爆发八个实例,我们供给选取同步来制止二十四线程问题。如下,在getInstance()方法前使用synchronized关键字:

1 public static synchronized Singleton getInstance() {

四、考虑质量难点。synchronized关键字修饰getInstance()方法,会招致全数调用getInstance()方法的线程都要竞争同一把锁,就算在单例对象已经成形好的场合下。这里运用double check的艺术。别的,还需求注意instance在开端化进度中,恐怕曾经不为NULL,那样有十分大可能率会促成程序崩溃,因而这里加了个偶尔变量t,确定保证先河化落成之后再赋值给instance。

public static Singleton getInstance() {
    if (instance == null) {
        synchronized (Singleton.class) {
            if (instance == null){
                Singleton t = new Singleton();
                instance = t;
            }
        }
    }
    return instance;
}

五、更简化的诀要。基于静态内部类的性状,大家得以采用它的懒加运载飞机制简化完成:

1 public static Singleton getInstance(){
2     return NestedClass.instance;
3 }
4 
5 private static class NestedClass{
6     private static Singleton instance = new Singleton();
7 }

面试的时候时有时会问到Java的单例形式,那道题能很好的洞察候选人对知识点的明白程度...

一般Singleton方式平日有几各种方式:

率先种方式:

概念两个类,它的构造函数为private的,它有三个static的private的此类变量,在类初叶化时实例话,通过三个public的getInstance方法赢得对它的引用,继而调用个中的点子。

public class Singleton {private Singleton(){}      //在自己内部定义自己一个实例,是不是很奇怪?      //注意这是private 只供内部调用      private static Singleton instance = new Singleton();      //这里提供了一个供外部访问本class的静态方法,可以直接访问        public static Singleton getInstance() {        return instance;         }     } 

第三种情势:

public class Singleton {   private static Singleton instance = null;  public static synchronized Singleton getInstance() {  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次       //使用时生成实例,提高了效率!  if (instance==null)    instance=new Singleton();return instance;   } } 

别的格局:

概念二个类,它的构造函数为private的,全数办法为static的。
一般感到首先种样式要更为安全些

那是东京尚学堂Java培养练习学员面试蒙受的一个标题,供我们仿照效法,新加坡尚学堂根据大量的学生面试时的面试题整理出一站式全部的《Java面试学习手艺大全》,应接来北京尚学堂领取。

本文由编程发布,转载请注明来源:五种方法实现Java的Singleton单例模式