2011-06-25 53 views
0

我不完全理解同步塊在做什麼,也不知道爲什麼它是必要的。 有人可以解釋一種「同步傻瓜」的方式嗎?Android同步?

在我正在閱讀的一本書中,作者告訴我「同步是必要的,因爲我們在 同步塊中操縱的成員可以在UI線程的onPause()方法中操作。」 他創建一個名爲stateChanged的對象並將其實例化爲一個新對象。 然後,在同步塊中,他使用stateChanged對象作爲參數。 這整件事都讓我失望,我不想繼續前進,直到我對發生的事情有非常好的理解。

回答

1

經典的例子:假設你有兩種操作線程,並且兩者引用相同的方法:

public void addToGlobalVar(int y) { 
int x = globalVar; //what if a thread stops right after this line? 
x += y; 
globalVar = y; 
} 

其中globalVar一些其他的預定數量,這種方法可以用,並設置互動。可以說globalVar是50.

線程在某種程度上隨意獲得計算時間,所以你永遠不會完全知道精確的納秒,一個停止,另一個獲得CPU時間。

在本例中,如果除了UI線程之外還啓動了AsyncTask,並且在某些時候使用addToGlobalVar(10),則可能發生的情況是一個線程可能在該代碼塊的第2行中斷。如果另一個線程在那個人正在睡覺的時候通過,它會成功設置globalVar爲60.但是當另一個線程醒來時,它仍然認爲x = 50,然後將它設置爲60.因此,本質上,你只是取得50 + 10 + 10 = 60。希望你能看到這成爲一個問題。

您可以通過使計算原子化(跳過聲明x,1行,完成所有計算)來解決這個簡單的例子,或者如果邏輯不能被壓縮到1行,您可以使代碼塊原子化使用​​。

+0

僅僅因爲它適合在一條線上不會使它原子或線程安全。 – Coeffect

0

在使用它之前,您必須完全理解它。這是標準的android同步使用面向對象的監視器。你必須理解它才能編寫多線程程序,但它有點過時(更好地使用java.util.concurrent代替相關的任何線程/同步)。

總之 - 你需要知道它是什麼 - 瞭解相關的Java教程部分:

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

1

閱讀本書是Java併發實踐。

你應該真的只是把這個想法從Android分離出來,儘管你的代碼將在Dalvik上運行,這是一個Java概念。不是Android的。

同步塊將一個對象作爲參數,任何對象,並且當流進入同步塊的主體時,任何其他線程運行到與參數具有相同實例(對象)的同步塊中等待前一個完成。這是一個非常基本的描述。

這是一個計算機科學的整個子領域,沒有認真的研究,你可能不會理解它。