1. 程式人生 > >執行緒安全和鎖優化

執行緒安全和鎖優化

   要保證執行緒安全,並不是一定就要進行同步,兩者沒有因果關係。 同步只是保證共享資料爭用時的正確性的手段,如果一個方法本來就不涉及共享資料,那它自然就無須任何同步措施去保證正確性,因此會有一些程式碼天生就是執行緒安全的,簡單地介紹其中的兩類。
   可重入程式碼(Reentrant Code):這種程式碼也叫做純程式碼(Pure Code),可以在程式碼執行的任何時刻中斷它,轉而去執行另外一段程式碼(包括遞迴呼叫它本身),而在控制權返回後,原來的程式不會出現任何錯誤。 相對執行緒安全來說,可重入性是更基本的特性,它可以保證執行緒安全,即所有的可重入的程式碼都是執行緒安全的,但是並非所有的執行緒安全的程式碼都是可重入的。

   可重入程式碼有一些共同的特徵,例如不依賴儲存在堆上的資料和公用的系統資源、 用到的狀態量都由引數中傳入、 不呼叫非可重入的方法等。 我們可以通過一個簡單的原則來判斷程式碼是否具備可重入性:如果一個方法,它的返回結果是可以預測的,只要輸入了相同的資料,就都能返回相同的結果,那它就滿足可重入性的要求,當然也就是執行緒安全的。
   執行緒本地儲存(Thread Local Storage):如果一段程式碼中所需要的資料必須與其他程式碼共享,那就看看這些共享資料的程式碼是否能保證在同一個執行緒中執行?如果能保證,我們就可以把共享資料的可見範圍限制在同一個執行緒之內,這樣,無須同步也能保證執行緒之間不出現資料爭用的問題。
   符合這種特點的應用並不少見,大部分使用消費佇列的架構模式(如生產者-消費者模式)都會將產品的消費過程儘量在一個執行緒中消費完,其中最重要的一個應用例項就是經典Web互動模型中的一個請求對應一個伺服器執行緒Thread-per-Request)的處理方式,這種處理方式的廣泛應用使得很多Web服務端應用都可以使用執行緒本地儲存來解決執行緒安全問題。