1. 程式人生 > >Android執行緒安全問題總結

Android執行緒安全問題總結

執行緒安全的定義

執行緒安全:如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的,或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題 。

Android的單執行緒模型

當一個程式第一次啟動的時候,Android會啟動一個LINUX程序和一個主執行緒。預設的情況下,所有該程式的元件都將在該程序和執行緒中執行 。主執行緒(Main Thread)主要負責處理與UI相關的事件,如:使用者的按鍵事件,使用者接觸螢幕的事件以及螢幕繪圖事 件,並把相關的事件分發到對應的元件進行處理。所以主執行緒通常又被叫做UI執行緒。

系統不會為每個元件單獨建立執行緒,在同一個程序裡的UI元件都會在UI執行緒裡實例化,系統對每一個元件的呼叫都從UI執行緒分發出去。結果就是,響應系統回撥的方法(比如響應使用者動作的onKeyDown()和各種生命週期回撥)永遠都是在UI執行緒裡執行。

UI執行緒才能與Android UI工具包中的元件進行互動,在開發Android應用時必須遵守單執行緒模型的原則:

1. Android UI操作並不是執行緒安全的並且這些操作必須在UI執行緒中執行。

2.不要阻塞UI執行緒。

為什麼說Android UI不是執行緒安全的?

android UI 中提供invalidate()來更新介面,而invalidate()方法是執行緒不安全。
Android提供了Invalidate方法實現介面重新整理,但是Invalidate不能直接在非UI主執行緒中呼叫,因為他是違背了單執行緒模型:Android UI操作並不是執行緒安全的,並且這些操作必須在UI執行緒中呼叫。例如:在非UI執行緒中呼叫invalidate會導致執行緒不安全,也就是說可能在非UI執行緒中重新整理介面的時候,UI執行緒(或者其他非UI執行緒)也在重新整理介面,這樣就導致多個介面重新整理的操作不能同步,導致執行緒不安全