有一個規則可以肯定地找出,所有可能在Java程序中有併發訪問的對象?我的意圖是使用這樣的規則(如果存在的話)找出哪些Java類可能具有併發訪問並確保它們是線程安全的。在檢查大型Java項目時,此規則可能非常有用。我曾經想過尋找靜態方法,但我不確定這是多線程訪問對象的唯一方式。有一個規則可以找出哪些對象可能在Java程序中具有併發訪問權限?
回答
看起來很不可能這樣的事情存在作爲單個規則。想象一下以下內容:
public void maybeAccessConcurrently(Program x) {
if(halts(x)) {
accessConcurrentObject();
} else {
// don't.
}
}
我不知道你,但類型簡單的檢查我真的不能圖謀的規則是不等同於這裏決定停機問題,特別是不或聲明。我認爲您可能會發現,像其他靜態分析技術一樣,您可以在合理範圍內檢查一組屬性。 Bandera project似乎是努力使用各種模型檢查技術來驗證併發Java代碼的屬性。可能還有其他類似的努力(考慮到併發的存在,所有這些努力都最有可能涉及模型檢查)。
有助於檢測可能受到併發訪問的類的規則集也會有所幫助。 – 2010-08-20 13:22:21
在收集許多錯誤肯定(以及一些錯誤否定)的風險下,您將在這種情況下基本上需要構建依賴關係圖,然後嘗試隔離不同線程內的不相交部分的代碼。我認爲使用一些併發的模型檢查軟件,比如我鏈接的模型檢查軟件可能會更容易,更容易。 – Gian 2010-08-20 13:26:02
不,不可能通過查看方法簽名來確定這一點。沒有規則只有靜態方法可以給出併發問題。
如果兩個線程共享對相同對象的引用,可以是直接引用(通過對同一對象進行引用),也可以是間接引用(通過靜態對象,靜態方法,所使用對象的成員等)。 )。使用代碼的靜態分析來檢測這些情況並不總是可能的。
我想過去找靜態 方法,但我不知道這是 的唯一途徑,對象可以是 多個線程訪問。
不,靜態方法根本無法幫到你。你甚至沒有限制對象。即使訪問原語也可能不是線程安全的。例如,增加一個long可能不是一個原子操作,這取決於你正在運行的平臺。阿法克你問的是不可能的。
我懷疑這樣(方便)的規則是可能的。試想一下:
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」應用程序被使用過類有併發訪問 - 因爲你可以在不同的線程,並啓動應用程序幾次將永遠不知道哪個類是開始的(信息隱藏在字符串文字中)以及其他什麼類可以實例化。
是的,它是非常有可能做出這樣的規則,
public static boolean canBeAccessedConcurrently(Object arg){
return true;
}
哈哈,真的。雖然你可能想接受一個對象來匹配OP的問題。 – 2010-08-20 13:20:12
我喜歡這個。讓我想起我最喜歡的隨機數字生成器:http://xkcd.com/221/ :-) – 2010-08-20 13:21:13
+1爲hilarity :) – 2010-08-20 13:49:19
退房靜態代碼分析FindBugs和PMD。他們有很多規則可以幫助找到潛在的併發問題。兩者都可以從命令行運行,因此您可以將它們合併到您的構建中,並且如果規則被違反,構建會被破壞。
- 1. DotNetFactory可以訪問哪些對象?
- 2. 有些環境變量可以訪問,有些則不可以?
- 3. PHP類與具有對象是可訪問這些對象
- 4. 在我的所有應用程序類中都可以訪問一個對象
- 5. 找出哪些用戶在郵箱上擁有完全訪問權限
- 6. 有沒有規則可以發現UB?
- 7. WebKit可以訪問哪些功能?
- 8. 如何找出java程序可以偵聽哪些網址
- 9. 是否有可能在JavaScript中捕獲財產訪問權限?
- 10. jjs中有哪些對象可用?
- 11. 如果沒有管理員權限,您可以獲得哪些註冊表訪問權限?
- 12. 解決此併發問題的可能設計有哪些?
- 13. 獲取哪些用戶具有管理員權限的帳戶(具有OAuthV2訪問權限)的API是什麼?
- 14. Firebase安全規則可以檢查某人是否具有特定的訪問權限?
- 15. 有沒有辦法找到Java程序訪問哪些內存地址以及按什麼順序訪問?
- 16. 限制哪些功能可以修改對象
- 17. 沒有管理員權限的用戶是否可以管理配置單元中的對象訪問權限?
- 18. 可以打印出一個對象,但不能在JS中訪問它的值
- 19. 找出哪些接口可以查詢COM對象?
- 20. Can Yii2 RBAC權限有多個規則?
- 21. Java - 你可以有多少個對象?
- 22. 我能找出哪些文件可以被我的OS X沙箱訪問嗎?
- 23. 是否有可能在Android中擁有「可選」權限?
- 24. 找出哪個權限從哪個庫中合併
- 25. 找出在expando對象上訪問哪些屬性
- 26. 有人可以在這個Java程序中發現錯誤
- 27. Rails和Sequel中的值規範化有哪些工具可用?
- 28. Android服務可以有多個權限?
- 29. 子類訪問靜態成員有哪些規則?
- 30. 是否可以限制哪些程序可以啓動wpf應用程序?
目標是找出不是線程安全但應該是的類。我曾經考慮過檢查靜態方法,因爲它是提供共享對象的常用方法,就像對象工廠和單例一樣。 – 2010-08-20 13:17:16