静态内部类在另一个java类中是线程安全的吗?

静态内部类在另一个java类中是线程安全的吗?,java,static,thread-safety,inner-classes,Java,Static,Thread Safety,Inner Classes,为了收集较小的助手实用程序类,我创建了一个通用的类MyUtils: // MyUtils.java public final class MyUtils { public static class Helper1 {}; public static class Helper2 {}; //... } 来自MyUtils内部的此帮助程序类将在包的其他文件中使用: // MyClass1.java public class MyClass1 { private MyUtils.Help

为了收集较小的助手实用程序类,我创建了一个通用的
类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
之前,我的代码是线程安全的

我担心的是,通过将这些
类设置为内部
静态
,当它们的多个实例跨文件存在时,它们会保持线程安全吗?或者它们是否有任何不好的含义我是否因为使它们
静态
而丢失了它们

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

对于“类”本身是线程安全的或不是线程安全的,没有任何意义。因此,它是否是静态的无关紧要

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

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


希望有帮助。

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

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

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

我已经得到了答案。使
MyUtils
成为
界面
更简洁,因为我可以从
助手

中获得
静态
标识,如果您想知道这是否是从以下方面出发的任何不良影响:

public class Helper1 {}
…致:

public class MyUtils {
    public static class Helper1 {}
}
那就没有了。本例中的
static
关键字只是将嵌套的内部类“升级”到顶级类,这样您就可以实例化它,而不需要
MyUtils
的封闭实例。以下是一篇关于这个主题的文章:


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

链接已断开