執行緒安全的深入研究

2021-09-01 03:08:22 字數 935 閱讀 9788

1、什麼是執行緒安全(thread safe)?

乙個類要成為執行緒安全的類,就是在該類被多個執行緒訪問時,不管執行環境中執行這些執行緒有什麼樣的時序安排或者交錯,它仍然執行正確行為,並且在呼叫的**中沒有任何額外的同步。

2、什麼時候考慮執行緒安全問題?

當乙個類的例項為singleton的時候,你就要考慮該例項在呼叫的時候是否是執行緒安全的。

最熟悉的例子就是servlet, 每個servlet在servlet engineer中只有乙個例項。除非它實現singlethreaded介面。所以我們一般要求在servlet中不要定義成員變數,以避免執行緒不安全。

是不是凡是singleton的物件都不是執行緒安全的呢?答案是no。準確的表達應該是:只有該類中定義了有狀態的成員時該類才是執行緒不安全的

舉個例子:

public class a

}

id是乙個有狀態的變數。什麼是有狀態,就是指每次呼叫該類的時候如果該id值可能存在不同的值,那麼這個id就是有狀態的。

我們再看看下面的例子。

public class b

}

這個class b在單例項的情況下就是執行緒安全的。原因是:該類沒有有狀態的成員。i,j是區域性變數,某個執行緒都會有自己的stack儲存這些區域性變數。所以對於不同執行緒來說,這些變數是相互不影響的。

1、採用synchronized同步。缺點就是存在堵塞問題。

2、使用threadlocal(實際上就是乙個hashmap),這樣不同的執行緒維護自己的物件,執行緒之間相互不干擾。

總結:1、我們一般要求商業邏輯的bo為執行緒安全的類,這樣就可以將該bo建立成乙個單例項的物件,提高訪問的效率。為了使bo為執行緒安全的物件,我們所要做的很簡單,就是該類中不要有與狀態相關的成員變數。

flex Bindable深入研究

bindable 元資料標籤,它在 中的作用就是向編譯器提供如何編譯程式的資訊。它的最大作用是使程式元件間的資料同步變得容易。在開發中通常用上bindable作用在檢視控制項上,如給它繫結乙個物件,則以後只需要在邏輯層更改這個物件的值,則檢視層的控制項資料會自動更新 同步 而不再需要手動去更新檢視。...

URLRequest深入研究

urlrequest 的乙個例項 html view plain copy create the request.所構建的nsurlrequest具有乙個依賴於快取響應的特定策略,cachepolicy取得策略,timeoutinterval取得超時值 nsurlrequest therequest...

深入研究AsyncTask

asynctask提供了一種在後台執行操作而在ui執行緒顯示結果的方式,而且開發者不必操作執行緒或者handler.乙個asynctask定義了三種泛型分別是params,progress,result,還有四個函式分別是onpreexecute doinbackground onprogressu...