2011-06-24 34 views
4

对于较小的辅助工具类的集合,我创建了一个普通class MyUtils静态内部类线程在另一个java类中是否安全?

// 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(); 
    } 
} 

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

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

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

回答

13

static identifienr如果你问这些是否是从去任何不良后果:

public class Helper1 {} 

.. .to:

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

+1

+1,这是一个好点。 – iammilind

5

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

当某人提到一个线程安全或不是线程安全的类时,它们确实意味着该类提供的功能是线程安全的或不是线程安全的。相应地,内心阶层自己实际上在做出改变。

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

希望有所帮助。

0

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

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

0

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

0

我已经得到了答案。制作MyUtilsinterface更清爽的设计,因为我可以逃脱从helper