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

iam*_*ind 8 java static thread-safety inner-classes

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

// MyUtils.java
public final class MyUtils
{
  public static class Helper1 {};
  public static class Helper2 {};
//...
}
Run Code Online (Sandbox Code Playgroud)

内部的辅助类MyUtils将用于包的其他文件中:

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

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

我担心,通过使这些inner类在文件中存在多个实例时,它们static将保持线程安全吗?或者,由于制作它们,我是否遗失了任何不良影响static

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

aro*_*oth 20

如果你问这些是否有任何不良影响:

public class Helper1 {}
Run Code Online (Sandbox Code Playgroud)

...至:

public class MyUtils {
    public static class Helper1 {}
}
Run Code Online (Sandbox Code Playgroud)

然后不,没有.static在这种情况下,关键字只是将嵌套的内部类"提升"到顶级类,因此您可以在不需要封闭实例的情况下实例化它MyUtils.这是一篇关于这个主题的可通过的文章:

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

实质上,public static class X在嵌套的内部类上进行操作与public class X在标准顶级类中进行操作相同.


Shi*_*rik 7

"类"本身没有线程安全或线程安全的意义.因此,它是否是静态的是无关紧要的.

当有人提到一个线程安全或不是线程安全的类时,它们实际上意味着该类提供的功能是线程安全的.因此,内部类本身所做的事情实际上是有所不同的.

没有什么固有的方法可以使它们不可重入.当您开始访问共享变量等时会出现问题.因此,例如,方法访问的类的成员需要进行适当的同步.但是如果方法不存储任何状态等,那么就没有什么能阻止你跨多个线程使用它们了.

希望有所帮助.