2010-08-20 66 views
0

有一個規則可以肯定地找出,所有可能在Java程序中有併發訪問的對象?我的意圖是使用這樣的規則(如果存在的話)找出哪些Java類可能具有併發訪問並確保它們是線程安全的。在檢查大型Java項目時,此規則可能非常有用。我曾經想過尋找靜態方法,但我不確定這是多線程訪問對象的唯一方式。有一個規則可以找出哪些對象可能在Java程序中具有併發訪問權限?

+0

目標是找出不是線程安全但應該是的類。我曾經考慮過檢查靜態方法,因爲它是提供共享對象的常用方法,就像對象工廠和單例一樣。 – 2010-08-20 13:17:16

回答

2

看起來很不可能這樣的事情存在作爲單個規則。想象一下以下內容:

public void maybeAccessConcurrently(Program x) { 
    if(halts(x)) { 
     accessConcurrentObject(); 
    } else { 
     // don't. 
    } 
} 

我不知道你,但類型簡單的檢查我真的不能圖謀的規則是不等同於這裏決定停機問題,特別是或聲明。我認爲您可能會發現,像其他靜態分析技術一樣,您可以在合理範圍內檢查一組屬性。 Bandera project似乎是努力使用各種模型檢查技術來驗證併發Java代碼的屬性。可能還有其他類似的努力(考慮到併發的存在,所有這些努力都最有可能涉及模型檢查)。

+0

有助於檢測可能受到併發訪問的類的規則集也會有所幫助。 – 2010-08-20 13:22:21

+1

在收集許多錯誤肯定(以及一些錯誤否定)的風險下,您將在這種情況下基本上需要構建依賴關係圖,然後嘗試隔離不同線程內的不相交部分的代碼。我認爲使用一些併發的模型檢查軟件,比如我鏈接的模型檢查軟件可能會更容易,更容易。 – Gian 2010-08-20 13:26:02

1

不,不可能通過查看方法簽名來確定這一點。沒有規則只有靜態方法可以給出併發問題。

如果兩個線程共享對相同對象的引用,可以是直接引用(通過對同一對象進行引用),也可以是間接引用(通過靜態對象,靜態方法,所使用對象的成員等)。 )。使用代碼的靜態分析來檢測這些情況並不總是可能的。

2

我想過去找靜態 方法,但我不知道這是 的唯一途徑,對象可以是 多個線程訪問。

不,靜態方法根本無法幫到你。你甚至沒有限制對象。即使訪問原語也可能不是線程安全的。例如,增加一個long可能不是一個原子操作,這取決於你正在運行的平臺。阿法克你問的是不可能的。

1

我懷疑這樣(方便)的規則是可能的。試想一下:

public MyRunnable implements Runnable { 
    public run() { 
    Class.forName("com.example.MainClass").newInstance(); 
    } 
} 

後來

public class MainClass { 
    public MainClass() { 
    startApplication(); 
    } 

    public static startApplication() { 
    // A huge application is started 
    } 
} 

現在每次在執行「MainClass」應用程序被使用過類有併發訪問 - 因爲你可以在不同的線程,並啓動應用程序幾次將永遠不知道哪個類是開始的(信息隱藏在字符串文字中)以及其他什麼類可以實例化。

5

是的,它是非常有可能做出這樣的規則,

public static boolean canBeAccessedConcurrently(Object arg){ 
     return true; 
} 
+0

哈哈,真的。雖然你可能想接受一個對象來匹配OP的問題。 – 2010-08-20 13:20:12

+0

我喜歡這個。讓我想起我最喜歡的隨機數字生成器:http://xkcd.com/221/ :-) – 2010-08-20 13:21:13

+0

+1爲hilarity :) – 2010-08-20 13:49:19

2

退房靜態代碼分析FindBugsPMD。他們有很多規則可以幫助找到潛在的併發問題。兩者都可以從命令行運行,因此您可以將它們合併到您的構建中,並且如果規則被違反,構建會被破壞。

相關問題