[英]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.