当前位置: 代码迷 >> 综合 >> 面试题01 实现一个单例类
  详细解决方案

面试题01 实现一个单例类

热度:81   发布时间:2024-03-08 21:51:58.0

单例类

第一种形式: 饿汉式

定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class SingletonEH {/***是否 Lazy 初始化:否*是否多线程安全:是*实现难度:易*描述:这种方式比较常用,但容易产生垃圾对象。*优点:没有加锁,执行效率会提高。*缺点:类加载时就初始化,浪费内存。*它基于 classloder 机制避免了多线程的同步问题,* 不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,* 在单例模式中大多数都是调用 getInstance 方法,* 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,* 这时候初始化 instance 显然没有达到 lazy loading 的效果。*/private static SingletonEH instance = new SingletonEH();private SingletonEH (){}public static SingletonEH getInstance() {System.out.println("instance:"+instance);System.out.println("加载饿汉式....");return instance;}
}

第二种形式:懒汉式

定义一个类,它的构造函数为private的,它有一个static的private的该类变量,只有当调用getInstance的时候,才回去初始化这个单例。


public class SingletonLH {/***是否 Lazy 初始化:是*是否多线程安全:否*实现难度:易*描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。*这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。*/private static SingletonLH instance;private SingletonLH (){}public static SingletonLH getInstance() {if (instance == null) {instance = new SingletonLH();}return instance;}
}
  相关解决方案