【问题标题】:How does static work in a multi threaded environment?静态在多线程环境中如何工作?
【发布时间】:2011-01-15 23:01:19
【问题描述】:

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

【问题讨论】:

    标签: java static


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        首先,静态关键字在类声明中并不常用,虽然它可以在类声明中使用,但与变量或方法的含义不同。

        您真的想了解静态类吗?还是关于静态变量/方法的问题?

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 我不确定我是否完全理解您的问题。通常,类加载由 JVM 处理,但是您可以使用 Class.forName() 方法自己显式加载类。总是有一些线程必须进行加载,但您不必显式声明 new Thread() 对象来加载类。
          猜你喜欢
          • 2010-12-06
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 2011-04-30
          • 2018-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多