IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Java面试题

Java面试题:不使用锁如何实现线程安全的单例?

时间:2023-11-02 18:49:26 来源:IT袋 作者:马勇
导读:Java面试题,为大家介绍的是Java面试题的内容,接下来IT袋网带大家一起了解。 面试官问: 不使用锁,如何实现线程安全的单例? 如果不能使用synchronized和lock的话,想要实现单例可

Java面试题

为大家介绍的是Java面试题的内容,接下来IT袋网带大家一起了解。

面试官问:不使用锁,如何实现线程安全的单例?

如果不能使用synchronized和lock的话,想要实现单例可以通过饿汉模式枚举、以及静态内部类的方式实现。

Java面试题

饿汉:

其实都是通过定义静态的成员变量,以保证instance可以在类初始化的时候被实例化。

// 单例模式
// 饿汉式(静态变量)
class Singleton {
    // 1. 构造器私有化
    private Singleton() {}
    // 2. 本类内部创建对象实例
    private final static Singleton instance = new Singleton(); // 静态变量
    // 3. 提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance() {
        return instance;
    }
}

但是,如果从始至终未使用过这个实例,会造成内存浪费

静态内部类

这种方式和饿汉方式只有细微差别,只是做法上稍微优雅一点。

// 静态内部类实现
class Singleton {
    // 构造器私有化
    private Singleton() {}
    // 写一个静态内部类,含一个静态属性Singleton
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    // 提供一个静态的公有方法,直接返回SingleInstance.INSTANCE
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

原理和饿汉一样。这种方式是Singleton类被装载了,INSTANCE 对象不一定被初始化。

因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance

枚举

借助了 JDK1.5 中添加的枚举来实现单例模式,不仅避免了多线程同步问题,而且还防止反序列化重新创建新的对象

// 枚举实现单例
enum Singleton {
    INSTANCE; // 属性
}

其实,如果把枚举类进行反编译,你会发现他也是使用了static final来修饰每一个枚举项。

final class Singleton extends Enum
{
    public static final Singleton INSTANCE;
    private static final Singleton $VALUES[];
    public static Singleton[] values()
    {
        return (Singleton[])$VALUES.clone();
    }
    public static Singleton valueOf(String name)
    {
        return (Singleton)Enum.valueOf(cn/itsource/logweb/utils/Singleton, name);
    }
    private Singleton(String s, int i)
    {
        super(s, i);
    }
    static 
    {
        INSTANCE = new Singleton("INSTANCE", 0);
        $VALUES = (new Singleton[] {
            INSTANCE
        });
    }
}

其实,上面三种方式,都是依赖静态数据在类初始化的过程中被实例化这一机制的。

相关阅读

  • 什么是混合云 有哪些优缺点?

    什么是混合云 有哪些优缺点?

    本文核心导读:什么是混合云的电脑方面的小经验,接下来分享详细内容。 混合云结合了公共云和私有云的特点,允许数据和应用程序在两者之间进行流动。 混合云的多样性 混合云可以由多

  • 如何在Firefox和Chrome中轻松截取完整网页截图

    如何在Firefox和Chrome中轻松截取完整网页截图

    关于这个如何在Firefox和Chrome中轻松截取完整网页截图方面的知识,一起跟随小编看看吧! Firefox 浏览器内置了截屏工具,你可以用它对整个网页进行截屏。Chrome 浏览器也有同样的功能。 截屏

  • Nacos服务注册与发现的原理详解

    Nacos服务注册与发现的原理详解

    这些知识你了解吗?Nacos服务注册与发现的原理详解的相关知识,一起来了解了解吧。 1.微服务在启动将自己的服务注册到Nacos注册中心,同时发布http接口供其他系统调用,一般都是基于Sprin

  • 香港服务器遭受DDoS攻击后如何恢复运行?

    香港服务器遭受DDoS攻击后如何恢复运行?

    这些方法你知道吗?香港服务器遭受DDoS攻击后如何恢复运行方面的内容,如有不对的地方欢迎指正! 您是否发现流量异常上升?您的网站突然崩溃了吗?当您注意到这些迹象时,可能是在陷入了