1. 程式人生 > >執行緒安全筆記一——執行緒安全概念

執行緒安全筆記一——執行緒安全概念

一、什麼是執行緒安全:

        個人理解:執行緒安全是指一段程式碼或程式,在多執行緒的情況下執行時,仍然能做出所期望的結果或行為。也就是說,如果一段程式碼或程式是單執行緒的,則他必定是執行緒安全的。換句話說,執行緒安全都是指的多執行緒。

        需要考慮執行緒安全的程式,必定是多執行緒的。但不是所有的執行緒安全的程式都需要考慮執行緒安全問題。只有在程式中存在可變的狀態,同時外界可以訪問或修改這個狀態時,才需要考慮執行緒安全。

        可變的狀態,其實就是一段可以改變的資料。若資料不是可變的,或不被外界訪問或修改時,則此段程式碼同樣不需要考慮執行緒安全問題。

二、什麼是競態條件(Race Condition)

        說到執行緒安全,有一個詞跟執行緒安全息息相關——競態條件,書上正規的解釋:由於兩個或者多個程序競爭使用不能被同時訪問的資源,使得這些程序有可能因為時間上推進的先後原因而出現問題,這叫做競爭條件。

        其實一開始看到這個競態條件很難理解(也有可能個人理解能力有限- -),Race 直面翻譯為競爭,Condition 直面翻譯為狀態。Race Condition則指的是執行緒之間競爭的一種狀態,競爭的東西就是程式裡的資源、資料,也就是上個節說的可變狀態。(PS:程式設計的東西好多都是老外寫的,畢竟計算機是老外發明的,這就造成了很多比較官方的書籍,其實都是出版社翻譯國外的,然後再出版。大部分的內容,翻譯是沒問題的,但有的部分可能看英文更容易理解)

        個人總結一下就是,如果說一個程式存線上程安全問題,則可以說這個程式存在競態條件。存在靜態條件,則代表執行緒不安全。

三、如何檢查程式是否是執行緒安全的

        對於一小段程式碼,熟悉執行緒安全知識的人一眼就能判斷這段程式碼是否執行緒安全,但在實際工作中,專案往往是比較龐大的,有時即使不算引用的框架,可能也有很多的程式碼量。況且有一部分公司都會用自己的框架(比較牛X的公司)或是自己對一些開源框架進行再封裝(這樣做的公司有兩類,一類是公司裡有技術大牛,封裝的非常完美。另一種是公司裡有裝b大神,封裝的漏洞百出)。所以想要檢測出專案中是否存線上程安全問題是比較困難的。

        方法一:對部分程式碼進行單獨測試。

        方法二:壓力測試。

        方法三:檢測工具。

        以上三種方法都不能完全保證檢測出專案中所有的問題。其實對於執行緒安全問題重點不是在發現,而是在編寫程式碼的時候就通過執行緒安全知識去避免問題的發生。而對於執行緒安全的編碼技巧有很多很多,這些技巧會在之後的文章中為大家一一列舉並詳細分析。

        如果對於以上文章有什麼不對的地方,或建議,歡迎各位大佬們提出,也可評論留言,大家一起交流一下。