我不完全理解同步塊在做什麼,也不知道爲什麼它是必要的。 有人可以解釋一種「同步傻瓜」的方式嗎?Android同步?
在我正在閱讀的一本書中,作者告訴我「同步是必要的,因爲我們在 同步塊中操縱的成員可以在UI線程的onPause()方法中操作。」 他創建一個名爲stateChanged的對象並將其實例化爲一個新對象。 然後,在同步塊中,他使用stateChanged對象作爲參數。 這整件事都讓我失望,我不想繼續前進,直到我對發生的事情有非常好的理解。
我不完全理解同步塊在做什麼,也不知道爲什麼它是必要的。 有人可以解釋一種「同步傻瓜」的方式嗎?Android同步?
在我正在閱讀的一本書中,作者告訴我「同步是必要的,因爲我們在 同步塊中操縱的成員可以在UI線程的onPause()方法中操作。」 他創建一個名爲stateChanged的對象並將其實例化爲一個新對象。 然後,在同步塊中,他使用stateChanged對象作爲參數。 這整件事都讓我失望,我不想繼續前進,直到我對發生的事情有非常好的理解。
經典的例子:假設你有兩種操作線程,並且兩者引用相同的方法:
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行,您可以使代碼塊原子化使用。
在使用它之前,您必須完全理解它。這是標準的android同步使用面向對象的監視器。你必須理解它才能編寫多線程程序,但它有點過時(更好地使用java.util.concurrent代替相關的任何線程/同步)。
總之 - 你需要知道它是什麼 - 瞭解相關的Java教程部分:
http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html
閱讀本書是Java併發實踐。
你應該真的只是把這個想法從Android分離出來,儘管你的代碼將在Dalvik上運行,這是一個Java概念。不是Android的。
同步塊將一個對象作爲參數,任何對象,並且當流進入同步塊的主體時,任何其他線程運行到與參數具有相同實例(對象)的同步塊中等待前一個完成。這是一個非常基本的描述。
這是一個計算機科學的整個子領域,沒有認真的研究,你可能不會理解它。
僅僅因爲它適合在一條線上不會使它原子或線程安全。 – Coeffect