Kotlin的单身人士线程安全吗?

alf*_*ngj 20 singleton thread-safety kotlin

Kotlin单身人士(更具体地说,对象声明)是否通过构造进行线程安全?如果没有,在Kotlin中编写线程安全单例的最佳做法是什么?

我猜它们是,但我无法在文档中找到任何关于它的明确声明.

Ser*_*kov 29

Kotlin"对象"通过构造是线程安全的.正如您在任何反编译/转储工具中所看到的,声明的对象只是具有静态实例初始化+语言语法糖的最终类,以简化实例访问

  • `object MySingleton` 被反编译为 public final `class MySingleton { public static final MySingleton INSTANCE; 静态 { MySingleton var0 = new MySingleton(); INSTANCE = var0;}}` `final` 修饰符真的会阻止创建多个实例吗?或者如果两个线程同时进入静态块并尝试创建并分配最终变量,是否会发生异常。因为没有“同步” (3认同)
  • @ user1185087答案是"是和否".当类加载器加载类时(在类加载器的本机实现中),将执行静态初始化块.类加载器永远不会同时加载类,因此静态初始化块始终是"同步"的.这不仅适用于Kotlin,也适用于任何JVM语言.从这个角度来看,答案是肯定的.但是可能存在多个类加载器,因此您可以多次加载一个类并获得几个单例的实例.这不是错误,而是一个功能. (3认同)