静态如何在多线程环境中工作?

时间:2011-01-15 23:01:20

标签: java static

如果我有静态类,jvm如何保证它被初始化一次?当两个线程第一次同时尝试访问时会发生什么?这种特征语言是不变的吗? 编辑:这是一个有静态变量的类。

4 个答案:

答案 0 :(得分:2)

JVM保证任何类只被初始化一次。

用于执行此操作的确切低级机制实际上是特定于JVM的,但是作为程序员需要知道的是,它本身是线程安全的,试图从不同的类访问/初始化同一个类线程。 (当然,这只是用于类加载:在访问任何不可变数据方面,无论是静态数据还是特定实例,都需要采取适当的措施。)

答案 1 :(得分:1)

您可以拥有一个静态嵌套类,其行为与任何其他类一样。

我假设您指的是静态代码/块和类初始化。 JVM保证只有一个线程加载一个类。由于它内置于JVM,我不认为任何语言都不会使用它。

答案 2 :(得分:0)

首先,静态关键字不是在类声明中常用的,虽然它可以在那里使用,但意味着与变量或方法不同。

你真的想知道静态类吗?或者它是关于静态变量/方法的问题?

答案 3 :(得分:0)

静态任何内容在加载类时初始化,而不是在第一个线程尝试访问它时。但是,对于数据成员或函数/方法,类的staticstatic不同。有关详细信息,请参阅this article。如果您询问数据成员,如果它们是静态的,那么它们被认为是“类变量”或“类方法”而不是“对象变量”(参见this article from Oracle for that discussion)。它通过使它们成为类对象本身的一部分而不是实例来实现。任何给定的类只有一个类对象。

关于您关于其他语言的问题:不,静态可能意味着许多不同的东西,具体取决于语言。