簡體   English   中英

如何測試我對 ConcurrentHashMap 的使用是線程安全的?

[英]How to test that my usage of a ConcurrentHashMap is threadsafe?

我寫了下面的代碼,想測試它的並發性。 即使我使用了ConcurrentHashMap ,我也不確定代碼是線程安全的,因為獲取和更新/替換在不同的行上使用。 誰能建議如何測試這個?

ConcurrentHashMap<String, int> somemap = new ConcurrentHashMap<>(); 
boolean some_method() {
    somemap.putifAbsent("somekey",value); 
    final int val = somemap.get("somekey");
    if(val < total_count) {
        val++;
    }
    somemap.replace("somekey", val);
}

誰能建議如何測試這個?

線程安全測試不可靠。 原因是,編程語言或庫的規范可能 promise 如果您的多線程程序遵守某些規則,那么您可以期望它以某種方式運行,但您實際上永遠找不到 promise 如果您的程序中斷規則那么它將無法滿足您的期望。

我個人已經看到一個軟件更新 go 經過數周的單元測試和集成測試,然后被運送到現場,運行了半年,直到一段“線程不安全”代碼導致它在客戶站點失敗.

確保您的多線程程序能夠運行的唯一方法是證明(A) 它說的是您認為它說的,以及 (B) 它遵守規則。

您的示例遵守規則,但我認為它沒有按照您的想法行事。 它有一個競爭條件。 也就是說,兩個線程都可以同時調用get("somekey") ,並且都獲得相同的值。 然后他們都可以計算出相同的新值,並且他們都可以put(...)它放回去。 兩次調用some_method() ,但最終結果是該值只增加了一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM