首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你知道?多个多线程环境下静态构造函数执行顺序

网上很多资料说到静态构造函数,但是很少提到与线程相关,这个例子实际上想测试一下静态构造函数多线程冲突。 其实,这个问题源自于XCode v7.3中一个隐秘BUG。...实体A静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A实例,但是因为A静态构造函数正常执行C,C...它本身也有静态构造函数,并且它静态构造函数里面会开一个线程去调用EntityFactory.CreateOperate(Type type),该方法会取得一个字典锁,然后通过Activator.CreateInstance...答案: 上面微软答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个实例或使用这个静态成员!...4,也是最隐秘地方。测试代码中,在A静态构造函数里面使用了匿名函数,而编译器会把它编译成为A一个静态方法,因此,它就成了A静态成员了,所以…… 实际上,我们没注意到地方第四点,太粗心了!

87270
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    构造函数调用子类方法,写过

    派生于Base,Base构造函数与虚构函数均调用虚函数GetValue(),根据C++多态特性,应该是要调用DeriveGetValue()返回2,真的这样?...为什么Base构造函数与虚构函数即使调用虚函数,也是调自己函数呢?这跟构造函数与虚构函数调用顺序有关。子类对象构造时候,先调父构造函数初始化父,再调子类构造函数初始化子类。...子类对象虚构时候,恰恰相反,先调子类对象虚构函数,再调父虚构函数。输出结果也证明了这点。 所以如果父构造函数与虚构函数调用子类函数,那就非常危险了。...因为父构造函数执行时,子类构造函数还没有执行,说明子类还没有初始化,而这时就调用子类方法,很容易出错,甚至崩溃。...父虚构函数执行时候,子类虚构函数已经执行完毕,说明子类资源已经被释放,而这时继续执行子类方法,也很容易崩溃。于是,C++规范为此作了此约束。

    1.4K20

    静态方法可以重写

    重写(Override)作为Java特性之一,经常被作为面试问题。 比较坑一个问题,子类能否重写父静态方法? 答案当然可以。...但是重写之后会发生什么,是否调用子类静态方法会执行子类逻辑,这才是坑所在地方。 重写 回顾一下Override定义,重写对父允许访问方法实现逻辑进行重新编写。...这也就证明了,静态方法在编译时使用了编译信息,进行静态绑定。它和对象无关,而和有关。 总结 对于静态方法,我们不应该尝试去重写,而且调用时应该以进行调用,而不是对象进行调用。...重写,说根据运行时对象类型来决定调用哪个方法,而不是编译时类型。静态方法属于方法,在编译阶段就确定了。因此即使重写了也没意义。...而对于静态方法调用,虽然Java允许通过对象来调用,但只是为了开发方便,正确姿势通过来调用。

    1.5K20

    子类A继承父B, A a = new A(); 则父B构造函数、父B静态代码块、父B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行先后顺序

    (1)子类A继承父B, A a = new A(); 则: 父静态代码块->子类A静态代码块->父B非静态代码块->父构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式调用了父构造函数...,但是该类继承自A,所以要先调用父构造方法,这里通过super(“B”)显示调用了父带参构造。...执行父带参构造前要先对父对象进行初始化,对父c成员进行初始化,调用了C无参构造,所以调用顺序为: 先调用C无参构造 再调用A带参构造 最后调用调用子类构造 (3...)在JVM调用mian方法之前先用进行静态内容初始化。...顺序为:父静态变量, 父静态代码块 ,子类静态变量,子类静态代码块。

    2.1K30

    构造方法方法复合

    尤其课后留一道“小明型”题更是让我信心大跌。不管难度如何,学好坏,一天结束了也得总结一下,不然这一天对于我算是白过了。 今天主要讲了三个知识点:1.构造方法 2.方法 3.复合。...三个知识点,属方法比较简单,构造方法复合打的一个机车,复合理解理解起来虽不是很难,但出题确实让人头大到爆。下面就由浅到深,由简单到难总结一下今天学过知识。...用了构造方法之后,主函数代码就更加地精简了。 构造方法返回值类型一个指针类型。...本人在学习时候感觉构造函数和set函数挺像,都是设置成员变量值。可set方法可以用来修改初始化之后值。...其次构造方法实现,将参数传给定义变量中,(和其他简单构造方法一样)。

    1.1K10

    Java中静态代码块、构造代码块、构造方法、普通代码块

    前言 Java中静态代码块、构造代码块、构造方法、普通代码块执行顺序一个比较常见笔试题,合理利用其执行顺序也能方便实现项目中某些功能需求 。...尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能不安全;   2.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般方法在程序执行到它时候被调用...;   3.当定义一个时候,通常情况下都会显示该类构造函数,并在函数中指定初始化工作也可省略,不过Java编译器会提供一个默认构造函数.此默认构造函数不带参数。...普通代码块 普通代码块和构造代码块区别是,构造代码块中定义,而普通代码块方法体中定义。且普通代码块执行顺序和书写顺序一致。...子类构造代码块执行完毕再去执行子类构造方法。   总之一句话,静态代码块内容先执行,接着执行父构造代码块和构造方法,然后执行子类构造代码块和构造方法

    3.5K10

    静态方法只能通过名进行调用_java非静态方法可以调用静态方法

    静态方法调用三种方式: 1、new xx().静态(); //使用对象调用,不推荐 2、xx.静态(); //名调用,正规调用方法,推荐 3、静态(); //本类静态方法在本类调用,直接调用...注意事项: 在同包不同类调用时候,可以直接 名.方法() 调用,无需创建对象。...在不同包调用时候,需要引包再调用。 欢迎各位在评论区留言探讨 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.1K10

    Java里构造函数(构造方法)

    参考链接: java构造函数 本文转载之https://www.cnblogs.com/livterjava/p/4709561.html 构造函数一种特殊方法。...一, 构造函数特点: 构造函数主要作用是完成对象初始化工作,(如果写里面没有构造函数,那么编译器会默认加上一个无参数且方法体为空构造函数).它能够把定义对象时参数传给对象域。...一个可以定义多个构造方法,如果在定义时没有定义构造方法,则编译系统会自动插入一个无参数默认构造器,这个构造器不执行任何代码。构造方法可以重载,以参数个数,类型,顺序。  ...:默认情况下,一个会有一个默认构造函数,这个构造函数没有内容也没有返回值,一般都回略去不写.这种情况下,编译器在编译时候会默认加上一个无参且方法体为空构造函数.但是,如果类构造函数被重写了,如上例...,Person已经有了一个有参数有方法构造函数,这时编译器就不会再给它默认加上一个无参且方法体为空构造函数.可以理解为无参构造函数被覆盖了.这种情况称为没有默认构造函数.

    2.5K00

    java学习之路:14.构造方法静态变量,常量和方法方法

    1.构造方法 中除了成员方法,还有一种特殊方法,那就是构造方法构造方法一个与类同名方法,对象创建就是通过构造方法完成,每当实例化一个对象时,都会自动调用构造方法。...如果在中定义构造方法都不是无参构造方法,那么编译器也不会为设置一个默认无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错,所有只有在中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数构造方法...并且this也可以调用构造方法。...3.方法 public static void main(String[] args ) { } 主方法入口点,它定义了程序从何处开始,主方法提供对程序流程控制,java编译器通过主方法来执行程序...主方法静态,所以在主方法中调用其他方法,被调用方法也必须静态。 主方法没有参数。 主方法形参为数组。

    91741

    构造方法

    1、构造方法概述 1.1、什么构造方法 构造方法正常开发中不可或缺一部分,语法上必须存在一个具有特殊格式方法,且有特殊调用方式。...这个过程我们看不到。 如果手动给出了构造方法,java则不会再自动补齐任何构造。...而不同,其他方法调用是为了这个方法对应功能,而构造方法功能就是创建对象,同时可以为属性赋值。 我们在此之前创建对象方式均是通过构造方法,这样当对象创建出来后就已经具备了非默认值初始值。...,抽象具有构造方法 构造方法不能被继承,如:父叫Person,子类叫Student 继承构造方法后,那么我new Person()后子类对象,还是父对象,我们分不清楚 。...而且构造方法要求与名相同,那么子类里面的Person构造方法名冲突了 构造方法public并不是固定不变,可以使用其他格式修饰构造方法

    1.1K20

    java静态属性,静态块,构造函数执行顺序

    今天为了搞清楚实例化一个对象时其属性等实例化顺序,写了下面的例子来探究: 实例化一个C对象,其中,A为其静态属性,B为其普通属性;D为C,E为D静态属性,F为D普通属性;C中还包含了静态代码块和普通代码块.../** * 静态代码块先于构造器执行 普通块先于构造块 只执行一次 * 凡是静态与对象无关,先于对象存在; 凡是静态都是共享 */ B b = new B(); static...public C(){ System.out.println("构造函数C"); } } 运行结果: -------第1次实例化------- 父静态属性E 构造静态属性A 静态代码块...父普通属性F 构造D 构造普通属性B 普通代码块 构造函数C -------第2次实例化------- 父普通属性F 构造D 构造普通属性B 普通代码块 构造函数...C 结论(实例化顺序): 父静态属性 父静态代码块 子类静态属性 子类静态代码块 父普通属性 父普通代码块 父构造函数 子类普通属性 子类普通代码块 子类构造函数 静态东西只在第一次实例化时候执行

    1.1K60

    构造函数和析构函数

    一、构造函数和析构函数由来 数据成员不能在声明时候初始化,为了解决这个问题? 使用构造函数处理对对象初始化。...构造函数一种特殊成员函数,与其他函数不同,不需要用户调用它,而是创建对象时候自动调用。析构函数对象不再使用时候,需要清理资源时候调用。...二、构造函数 (1)初识初始化 C++支持两种初始化形式:复制初始化和直接初始化,对于直接初始化直接调用实参匹配构造函数,复制初始化总是调用复制构造函数。...主要是因为复制构造函数可以由编译默认合成,而且公有的(public),编译器就是根据这个特性来对代码进行优化。...2、对于复制初始化构造函数调用方式,编译器已经将其作为普遍方法而不是作为一种优化。 3、初始化过程中“=”,隐式调用复制构造函数,而不是调用赋值运算符函数

    1.8K20

    实例化顺序:静态数据、构造函数和字段执行顺序详解

    引言 在面向对象编程中,实例化一个重要概念。当我们创建一个实例时,其中涉及到多个步骤,包括父和子类静态数据初始化、构造函数执行以及字段初始化。...这些静态数据在整个层次结构中只会初始化一次。 父构造函数:接着,父构造函数会被调用。父构造函数可能会执行一些初始化操作,例如设置实例字段默认值。...子类静态数据初始化:在父静态数据初始化完成后,子类静态数据也会被初始化。同样,这些静态数据在整个层次结构中只会初始化一次。 子类构造函数:最后,子类构造函数被调用。...子类构造函数通常会首先调用父构造函数,然后执行子类自己初始化操作。 字段初始化:在构造函数执行期间,实例字段(非静态字段)会被初始化。...实例化顺序总结 通过上述示例和步骤分析,我们可以总结实例化顺序如下: 父静态数据初始化。 父构造函数,包括父字段初始化。 子类静态数据初始化。

    64320

    静态静态方法

    静态方琺①種 特殊成園方琺,它不属纡某一个具体实唎,而是属于本裑。葰以对静态方法不需要首先创建一个哋实例,而是采用名.静态方法格式 。   ...1.static方法一个成園方法,属于整个,即不用創建任何对象也可以直接调用!   static内部只能出现static变量和其他static方法!...洏且static方法中还不能使用this....等关键字..因为它湜属于整个!   2.静态方法效率上要比实例化高,静态方法缺点不洎动进垳销毁,洏实例化则可以做销毁。   ...方法笩码只有一份,它们生命周期和一致哋.实例方法通过对象名调用,静态方法关联而不是与对象名关联.   5.哪么在程序狆什么地方可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用数据...公用处理函数,使用静态方法应该没有问趧..牵涉到数据共享,静忲变量函数要多考虑...静态变量要小心使用..

    1.4K20
    领券