当前位置: 首页 > 面试题库 >

Java中的单例和多线程

戴建义
2023-03-14
问题内容

在多线程环境中使用Singleton类的首选方法是什么?

假设我有3个线程,并且所有这些线程都尝试同时访问getInstance()单例类的方法-

  1. 如果不保持同步会怎样?
  2. 在内部使用synchronized getInstance()方法还是使用synchronized块是好的做法getInstance()

请告知是否还有其他出路。


问题答案:

从理论上讲,这项任务并不容易,因为您要使其真正成为线程安全的。

在此上找到了一篇非常不错的论文@
IBM

仅获取单例不需要任何同步,因为这只是读取。因此,只需同步Sync的设置即可。除非有两个步骤试图在同一时间启动时创建单例,否则您需要确保检查实例是否设置两次(一次在同步之外,一次在同步内部),以避免在最坏的情况下重置该实例。

然后,您可能需要考虑JIT(即时)编译器如何处理乱序写入。尽管无论如何都不会100%保证线程安全,但此代码将在解决方案附近:

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

因此,您也许应该诉诸于不那么懒惰的事情:

class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() { }

    public static Singleton getInstance() {
        return instance;
    }
}

或者,更肿,但更灵活的方法是避免使用静态单例,并使用诸如Spring之类的注入框架来管理“单例”对象的实例化(并且您可以配置惰性初始化)。



 类似资料:
  • 问题内容: 有关Singletons的维基百科文章提到了一些用线程安全的方法来用Java实现结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被多个线程访问的Singleton。 首先,这个未提及的方法是线程安全的吗?如果是的话,它在什么上进行同步? 其次,为什么以下实现线程安全且在初始化时是懒惰的?如果两个线程同时进入该方法,到底会发生什么? 最后,在第二个示例中,如果一个线程首先获取一

  • 本文向大家介绍Java多线程实战之单例模式与多线程的实例详解,包括了Java多线程实战之单例模式与多线程的实例详解的使用技巧和注意事项,需要的朋友参考一下 1、立即加载/饿汉模式 立即加载/饿汉模式是在类创建的同时已经创建好一个静态的对象供系统使用,不存在线程安全问题 2、延迟加载/懒汉模式 延迟加载/懒汉模式是在调用方法时实例才被创建,在多线程环境下,会出现取出多个实例的情况,与单例模式的初衷是

  • 现在,他提出的下一个问题是为多线程环境编写单例类。然后,我写了双重检查单例类。 然后,他反对使用和双重检查,并说这是没用的。为什么要检查两次,为什么要使用synchronized?我试着用多种方案说服他。但是,他没有。 后来,我在家里尝试了下面的代码,在那里我使用了带有多个线程的简单的单例类。 那么,问题是,在多线程环境中是否有必要使用或/和双重检查方法?似乎我的第一个代码本身(没有添加任何额外的

  • 本文向大家介绍Python中单线程、多线程和多进程的效率对比实验实例,包括了Python中单线程、多线程和多进程的效率对比实验实例的使用技巧和注意事项,需要的朋友参考一下 python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优

  • 本文向大家介绍Java多线程中的单例模式两种实现方式,包括了Java多线程中的单例模式两种实现方式的使用技巧和注意事项,需要的朋友参考一下 Java多线程中的单例模式 一、在多线程环境下创建单例 方式一: 方式二: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 本文向大家介绍Java线程安全中的单例模式,包括了Java线程安全中的单例模式的使用技巧和注意事项,需要的朋友参考一下 此种写法利用了类加载器的加载原理,每个类只会被加载一次,这样单例对象在其内部静态类被加载的时候生成,而且此过程是线程安全的。     其中method()方法封装内部单例对象的私有方法,作为对外接口使用,这样就可以如下调用     另外一种方式为采用枚举来实现。 以上就是本文的全