2011-09-19 103 views
0

@Synchronized評論警告說:如何避免不幸的副作用,在使用同步

鎖定在這個或你自己的類對象可以有不幸 的副作用,如其他代碼你的控制沒有根據可以鎖定 這些對象,這可能會導致競爭條件和其他討厭的 線程相關的錯誤。

避免競爭條件就是爲什麼我需要使用synchronized修改的原因,但是當我看到這樣的警告,我意識到,我可能不知道有關一切會導致弊大於利系統正在編程...

在我的特殊情況下,我需要確保WebView-subub的特定方法不會被PictureListener.onNewPicture()中斷。

該方法是由我編寫的,但它只能通過定時器處理程序由Runnable.run()調用。

我應該怎麼決定,這是安全使用​​修改,以確保該定時器調用的方法不受PictureListener.onNewPicture()中斷前檢查?

回答

3

的解決方案是使用私有對象作爲對象的鎖,就像這樣:

類定義:

private Object syncRoot=new Object(); 

private static Object syncRoot=new Object(); 

在您的代碼:

synchronized(syncRoot){ 
    // put your code here 
} 

競爭條件可能發生的原因是其他代碼有權訪問鎖定的對象。只鎖定私人對象解決了這個問題。

+0

我剛剛意識到這實際上暗示在我發佈的引用中,但是你寫的更清晰和更具說明性。 +1 – uTubeFan

1

在您同步的類中有一個屬性,而不是在this或WebView子類object上同步。

0

這些副作用大多會影響服務器系統。我不認爲在Android上你會遇到很多問題,因爲沒有太多可能會觸及你的方法的問題。

+0

我想用這個你的答案來簡化我的代碼,但是我對Android內部工作不夠熟悉。如果有一個特定的源文件,例如,定時器調用總是在'onNewPicture()'事件之間交織,這就足夠了,但我不知道。 – uTubeFan

+0

我的觀點是,沒有太多的碰撞會影響性能。會有一些,否則你不需要'同步'。 –