【问题标题】:Is static inner class thread safe inside another java class?另一个java类中的静态内部类线程是否安全?
【发布时间】:2011-09-21 17:36:56
【问题描述】:

为了收集较小的辅助实用程序类,我创建了一个通用的class MyUtils

// MyUtils.java
public final class MyUtils
{
  public static class Helper1 {};
  public static class Helper2 {};
//...
}

MyUtils 内部的这个帮助类将在包的其他文件中使用:

// MyClass1.java
public class MyClass1
{
  private MyUtils.Helper1 help1 = new MyUtils.Helper1();
  public void method ()
  {
    private MyUtils.Helper2 help2 = new MyUtils.Helper2();
  }
}

为了让它们可以访问,我在MyUtils 中设置了static(它自己没有任何数据/函数成员)。我的代码是线程安全的之前创建MyUtils

我担心的是,通过使这些innerstatic它们保持线程安全,当它们的多个实例将存在于文件中时?或者他们的任何不好的暗示是我因为让他们static而错过了吗?

编辑:我没有触及helper 类中的任何共享变量。我唯一担心的是static 类的实例是否是线程安全的(因为它们是static)。

【问题讨论】:

    标签: java static thread-safety inner-classes


    【解决方案1】:

    如果你问这些是否有任何不好的含义:

    public class Helper1 {}
    

    ...到:

    public class MyUtils {
        public static class Helper1 {}
    }
    

    那么不,没有。在这种情况下,static 关键字只是将嵌套的内部类“提升”为顶级类,这样您就可以在不需要 MyUtils 的封闭实例的情况下实例化它。这是一篇关于这个主题的合格文章:

    http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html

    本质上,在嵌套内部类中执行public static class X 与在标准顶级类中执行public class X 相同。

    【讨论】:

    • 链接失效
    【解决方案2】:

    “类”本身是线程安全的还是非线程安全的没有意义。因此,它是否是静态的无关紧要。

    当有人提到一个类是线程安全的或非线程安全的时,他们实际上是指该类提供的功能是否是线程安全的。因此,真正发挥作用的是内部类自己做的事情。

    方法本身并没有使它们无法安全地重入。当您开始访问共享变量等时会出现问题。因此,例如,方法访问的类的成员需要适当地同步。但是,如果这些方法不存储任何状态等,那么没有什么能阻止您跨多个线程使用它们。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      您需要保护对help1 的访问,因为这是一个实例级别(共享)变量。 虽然help2 是安全的,但如果您不允许它跳过该方法。

      静态类和由它创建的实例没有什么特别之处。 相同的线程安全规则适用于静态类的实例,也适用于正常情况。

      【讨论】:

        【解决方案4】:

        静态方法和内部类无法访问其动态计数器部分的变量,因此无法在其父类的实例上使用监视器/同步。当然,这并不意味着声明和使用它们本质上是非线程安全的。只是如果您需要在父类的实例上同步这些静态方法中的任何一个,那么您需要确保在输入它们之前同步/锁定它们,否则您必须显式传递引用到它们的父实例中。

        【讨论】:

          【解决方案5】:

          我已经得到了答案。将MyUtils 设为interface 是更简洁的设计,因为我可以摆脱helper 类中的static 标识符

          【讨论】:

            猜你喜欢
            • 2015-09-29
            • 2011-11-29
            • 2012-09-22
            • 2015-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多