首页 > 其他分享 >反面单例

反面单例

时间:2023-11-17 23:02:04浏览次数:25  
标签:初始化 StupidSingleton getInstance 反面 object static 单例 null

反面单例

代码

import java.util.ArrayList;
import java.util.List;

/**
 * @since : 2023/11/17
 **/
public class StupidSingleton {
    private static final StupidSingleton instance = new StupidSingleton();

    private static List<String> list = null;

    private static Object object = null;

    private StupidSingleton() {
        list = new ArrayList<>();
        object = new Object();
    }

    public synchronized static StupidSingleton getInstance() {
        if (object == null) {
            object = new Object();
        }
        return instance;
    }

    public void doSomething() {
        list.add("Stupid");
    }
}

问题点解析

doSomething抛出空指针异常

Java中字段、代码块、构造函数初始化顺序是:

  1. 按照在代码中的定义顺序依次加载static变量和static代码块。
  2. 按照在代码中的定义顺序依次加载实例变量和实例代码块。
  3. 构造函数。

代入这段代码中顺序为:

  1. 初始化instance = new StupidSingleton()
  2. 执行构造函数
  3. 初始化list = null
  4. 初始化object = null

虽然result和object都在构造函数中初始化了,但是随后又被赋值为null。

多线程下效率低

估计后来的修改者发现了object为空的问题,所以在getInstance中又做了初始化,这样一来,多线程下就有问题,在getInstance上加个synchronized就好了。

getInstance是static的,这个时候配合synchronized锁的就是StupidSingleton.class,多线程下效率必然低。

修改方案

  1. 把instance的初始化放在所有static变量定义的最后或者在静态变量定义时直接初始化,不在构造函数中初始化。
  2. 删除getInstance的synchronized。
  3. 删除getInstance中对object的控制判断和初始化。

标签:初始化,StupidSingleton,getInstance,反面,object,static,单例,null
From: https://www.cnblogs.com/u6b66/p/17839856.html

相关文章

  • 第十三章 -------------------WPF应用程序实现单例
    publicpartialclassApp:Application{System.Threading.Mutexmutex;publicApp(){this.Startup+=newStartupEventHandler(App_Startup);}voidApp_Startup(objectsender,StartupEventArgse){boolret;......
  • 1.单例设计模式
    单例模式的五种实现方式1、饿汉式(线程安全,调用效率高,但是不能延时加载publicclassImageLoader{privatestaticImageLoaderinstance=newImageLoader;privateImageLoader(){}publicstaticImageLoadergetInstance(){returninstanc......
  • 简单例子理解 Qt 中 QObject: Cannot create children for a parent that is in a dif
    c++guiprogrammingwithqt中关于QThread的用法的限制下面这句话的翻译不清QObjectisreentrant,buttherearethreeconstraintstokeepinmind:ChildQObjectsmustbecreatedintheirparent'sthread.Inparticular,thismeansthattheobjectscreatedina......
  • Unity-单例模式
    Unity-单例模式前言​ 对于某些特殊的类,我们希望在整个程序的生命周期只创建一个该类的对象,或是希望在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成单例模式单例的简单实现publicclassTest(){ pubicabstractTestInstance;//创建程序中该......
  • 过期监听实现定时任务的反面教材
    一、场景    在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作。    像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内,那他们是怎么实现的呢?    一般实现方法有几种: 使用RocketMQ、RabbitM......
  • 单例模式C++实现
    单例模式全局静态变量实现饿汉式单例模式饿汉式实现方式是线程安全的。黑#includeusingnamespacestd;/*饿汉式单例模式*/classSingleObject{private:staticSingleObjectinstance;SingleObject(){std::cout<<"Singleton......
  • 单例
    什么是单例模式?单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点#线程1执行:cursor.excute('select*fromuser')#线程2执行cursor.excute('select*frombooks')#线程1执行cursor.fetchAll()#拿出查询到的数据#django,每个线程,一个连接对象-......
  • 单例模式
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。 packageTutorial_7;/***@authormendianyu*/publicclassStuID{//单例模式中的实例privatestaticStuIDinstance=null;//学号privateStringid;......
  • 每日随笔——单例模式
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。类图 源码:packageCS7;publicclassClient{publicstaticvoidmain(String[]args){StudentIDstu1,s......
  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......