【发布时间】:2011-01-15 23:01:19
【问题描述】:
如果我有静态类,jvm如何保证它被初始化一次?当两个线程第一次同时尝试访问时会发生什么?这种特征语言是不变的吗? 编辑 :这是关于一个具有静态变量的类。
【问题讨论】:
如果我有静态类,jvm如何保证它被初始化一次?当两个线程第一次同时尝试访问时会发生什么?这种特征语言是不变的吗? 编辑 :这是关于一个具有静态变量的类。
【问题讨论】:
JVM 保证任何类只被初始化一次。
执行此操作的确切低级机制实际上是特定于 JVM 的,但作为程序员,您需要知道的是,尝试从不同的访问/初始化相同的类本身是线程安全的线程。 (当然,这仅适用于类加载:就访问任何不可变数据而言,无论是静态数据还是特定实例,您都需要采取适当的措施。)
【讨论】:
您可以拥有一个静态嵌套类,并且其行为与任何其他类一样。
我假设您指的是静态代码/块和类初始化。 JVM 保证一个类只能由一个线程加载。由于它内置于 JVM,我不认为任何语言都不会使用它。
【讨论】:
首先,静态关键字在类声明中并不常用,虽然它可以在类声明中使用,但与变量或方法的含义不同。
您真的想了解静态类吗?还是关于静态变量/方法的问题?
【讨论】:
在加载类时初始化任何静态内容,而不是在第一个线程尝试访问它时。但是,类的static 与数据成员或函数/方法的static 不同。有关更多信息,请参阅this article。如果您询问数据成员,如果它们是静态的,那么它们被认为是“类变量”或“类方法”而不是“对象变量”(参见this article from Oracle for that discussion)。它通过使它们成为类对象本身而不是实例的一部分来实现这一点。任何给定的类都只有一个类对象。
关于您关于其他语言的问题:不,静态可能意味着许多不同的东西,具体取决于语言。
【讨论】:
Class.forName() 方法自己显式加载类。总是有一些线程必须进行加载,但您不必显式声明 new Thread() 对象来加载类。