当前位置: 首页 > 后端技术 > Java

面试突击50:单例模式有多少种写法?

时间:2023-04-02 01:29:24 Java

单例模式是面试的常客。常见的写法有4种:饿汉模式、懒汉模式、静态内部类和枚举。让我们一一看看。1.饿汉模式饿汉模式又称预加载模式。它在类加载时直接创建并初始化一个单例对象,因此不存在线程安全问题。它依赖于ClassLoader类机制,只在程序启动时加载一次,所以不存在线程安全问题。其实现代码如下:publicclassSingleton{//1.防止外部直接new对象破坏单例模式privateSingleton(){}//2.通过私有变量保存单例对象privatestaticSingletoninstance=newSingleton();//3.提供获取单例对象的公共方法publicstaticSingletongetInstance(){returninstance;}}优点:实现简单,不存在线程安全问题。缺点:对象是在加载类的时候创建的,创建后如果不使用会造成资源浪费。2、懒人模式懒人模式和饥饿模式刚好相反。所谓惰性模式就是延迟加载(lazyloading),就是说只有在第一次使用的时候才会初始化。其实现代码如下:publicclassSingleton{//1.防止外部直接new对象破坏单例模式privateSingleton(){}//2.通过私有变量保存单例对象privatestaticvolatileSingletoninstance=null;//3.提供public获取单例对象的方法publicstaticSingletongetInstance(){if(instance==null){//第一次验证synchronized(Singleton.class){if(instance==null){//第二个验证实例=newSingleton();}}}返回实例;}}lazyman模式使用双重验证锁和volatile来保证线程安全。从上面的代码我们可以看出,不管是饿汉模式还是懒汉模式,它们的实现步骤是不一样的。同理:创建私有构造函数,防止其他直接new对象调用,这样创建出来的对象就不是单例对象了。创建一个私有变量来保存单例对象。提供一个返回单例对象的公共方法。懒人模式和饿鬼模式相比,不会造成资源的浪费,只是写法比较复杂。3.静态内部类静态内部类既可以保证线程安全,又可以保证懒加载。只有在调用时,才会通过ClassLoader机制加载并初始化内部静态类,所以是线程安全的。实现代码如下:publicclassSingleton{//1.防止外部直接new对象破坏单例模式privateSingleton(){}//2.静态内部类privatestaticclassSingletonHolder{privatestaticfinalSingletonINSTANCE=new单例();}//3.提供获取单例对象的公共方法publicstaticfinalSingletongetInstance(){returnSingletonHolder.INSTANCE;}}4.Enumeration枚举也是Java虚拟机在第一次使用时加载和初始化的,所以也是线程安全和懒加载的。其实现代码如下:publicenumEnumSingleton{INSTANCE;publicEnumSingletongetInstance(){返回实例;}}总结单例模式适用于频繁访问的对象,或者创建和销毁需要大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。单例模式常见的实现方式有四种:饿汉模式、懒汉模式、静态内部类和枚举。博主从编写的简洁性、线程安全性和代码的易懂性综合考虑,推荐使用枚举或者惰性模式来实现单例模式。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview