2011-06-24 33 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