我有一個線程鎖定了在我的Android應用程序仍有一些未知的原因,每當我試圖殺死從線程A線程B的一個問題(通常,有時它的工作)。我猜想這是因爲我的一些方法在線程間進行調用而未被同步。我製作了取消方法和許多基本上是事件處理程序同步的方法,並使幾個共享變量變得不穩定並且一切正常。在Java中同步聲明方法進行權衡?
我不知道是哪20個奇揮發性/同步聲明我實際上增加解決了這個問題,這讓我開始思考「我應該在乎嗎?它的工作原理不惹它!」中
所以,我的問題是:是否與聲明同步的方法或原揮發掉相關的任何交易?如果不需要這些聲明,是否有任何理由避免這些聲明?
編輯
的問題線程(S)是接收/發送數據流,這樣的AsyncTask和其他輔助線程型的解決方案並不能很好地工作藍牙連接。它們設計用於執行有限的任務,並在完成時終止。一些像ASyncTask一樣,也增加了很多簡單的殺死應用程序的開銷。對於像這樣持續運行的線程,使用線程仍然是最好的方法。
我使用的是Android Service生成和管理線程,所以我下面在這方面Android的設計範例。
有一個(小?)固有的性能損失。很難說出「鎖定線程的問題」是什麼(輪詢非易失性成員字段?),但是自由添加「synchronized」聽起來像是一個解決死鎖的好方法,並且您怎麼知道您的應用程序是沒有比賽條件?最大的問題是你在線程之間有很多共享狀態 - 你需要決定什麼需要共享,確保共享狀態是線程安全的(儘可能地提供不可變的幫助),並決定線程如何通信(Handler/ConcurrentLinkedQueue/LinkedBlockingQueue?)。 –