什麼是執行緒安全性

2021-10-07 07:37:33 字數 1588 閱讀 5421

給「執行緒安全性」下個定義相當棘手。很多正式的定義都顯得過於複雜,並沒有給出實用的指導或者精到的見解:而其他非正式的描述看上去又完全是在兜圈子。在google上搜尋了一下,查到很多定義略舉一二:

給出這樣的定義,讓我們對執行緒安全性產生困惑是不足為奇的!它們聽上去令人懷疑: 「如果乙個類可以安全地被多個執行緒使用,它就是執行緒安全的。」你無法對此論述提出任何爭議,但也無法從中得到更多有意義的幫助。我們如何辨別執行緒安全與非執行緒安全的類?我們甚至又該如何理解「安全」呢?

任何乙個合理的「執行緒安全性」定義,其關鍵在於「正確性」的概念。如果我們關於執行緒安全性的定義是模糊的,那是因為缺少乙個明確的「正確性」定義。正確性意味著乙個類與它的規約保持一致。良好的規約定義了用於強制物件狀態的不變約束以及描述操作影響的後驗條件。通常我們不會為類寫足夠的規約,那麼我們還能夠知道程式的正確與否麼?不能,但是只要我們相信「**是可以工作的」,就不會阻止我們使用這些類。這種「**自信」與我們所要實現的正確性緊密相關,所以不妨假設單執行緒化的正確性是「所見即所知」的事物。樂觀地將「正確性」定義為「可被認知事物」後,我們現在可以少兜些圈子來定義「執行緒安全性」 了:

乙個類是執行緒安全的,是指在被多個執行緒訪問時,類可以持續進行正確的行為。

當多個執行緒訪問乙個類時,這個類的行為仍然是正確的,那麼稱這個類時執行緒安全的。

注:如果不用考慮這些執行緒在執行時環境下的排程和交替執行,並且不需要額外的同步。

任何單執行緒化的程式同時也是合法的多執行緒化的程式,倘若程式在單執行緒化的環境尚且不正確,那麼該程式必然不是執行緒安全的。對於乙個正確實現的物件,順序性的操作,比如呼叫公共的方法,讀寫公共域,不會破壞任何乙個不變約束以及後驗條件。對於執行緒安全類的例項進行順序或併發的一系列搡作,都不會導致例項處於無效狀態。

執行緒安全的類封裝了任何必要的同步,因此客戶不需要自己提供。

示例:乙個無狀態的servlet展示了乙個簡單的因數分解的servlet,從request中解包資料,然後進行因數分解,最後將資料封裝到response中。

@threadsafe

public class statelessfactorizer implements servlet

}

無狀態物件永遠是執行緒安全的

多數servlet都可以實現為無狀態的,這一事實極大地降低了確保servlet執行緒安全的負擔,只有當servlet要為不同的請求記錄一些資訊時,才會將執行緒安全的需求提到曰程上來。

什麼是安全性測試

安全性測試 security testing 是有關驗證應用程式的安全服務和識別潛在安全性缺陷的過程。注意 安全性測試並不最終證明應用程式是安全的,而是用於驗證所設立策略的有效性,這些對策是基於威脅分析階段所做的假設而選擇的。web安全性測試 乙個完整的web安全性測試可以從部署與基礎結構 輸入驗證...

執行緒安全性

定義 當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。主要表現三個方面 atomic cas unsafe.compareandswapint atomiclong...

執行緒安全性

執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼稱這個類是執行緒安全的。執行緒不安全產生的問題 競態條件 由於不恰當的執行時序而出現不正確的結果。大多數競態條件的本質是基於一種可能失效的觀察結果來做出判斷或者執行某個計算。常見先檢查後執行,延遲初始化 單例模式 讀取 修改...