私は、スレッドAからスレッドBを削除しようとしたときに(通常、時にはうまくいきました)、私のAndroid Appに未知の理由があってもスレッドロックに問題がありました。自分のメソッドの中には、同期されずにスレッド間で呼び出しを行っていたためだと思いました。私はcancelメソッドと、本質的にイベントハンドラを同期させ、いくつかの共有変数をvolatileにして、すべてがうまくいくようなメソッドを作りました。Javaで同期メソッドを宣言してトレードオフしますか?
私が追加した20の奇数/同期の宣言のうち、実際に問題を解決したことは分かりません。
私の質問は次のとおりです。メソッドの同期化またはプリミティブなvolatileの宣言に関連するトレードオフはありますか?これらの宣言を必要としない場合は避けるべき理由はありますか?
編集
スレッド(S)問題のASyncTaskや他のワーカースレッド型ソリューションがうまく機能しないので、ストリーミングデータを送信/受信しているBluetooth接続です。有限のタスクを実行し、完了すると終了するように設計されています。 ASyncTaskのように、アプリケーションを単に終了させるオーバーヘッドが増えるものもあります。このようなスレッドを継続的に実行するには、スレッドを使用することが最も良い方法です。
私はアンドロイドServiceを使用してスレッドを生成および管理しています。そのため、私はその点でAndroidの設計パラダイムに従っています。
パフォーマンスペナルティが(小さな?)固有のものです。 「スレッドロックでの問題」(非揮発性メンバフィールドをポーリングする)が何であったのかを知るのは難しいですが、デッドロックを得るための良い方法のように 'synchronized'サウンドを自由に追加します。競争条件がない?大きな問題は、スレッド間で共有状態の*ロット*があることです。共有する必要があるものを決定し、共有状態がスレッドセーフであることを確認して(できるだけ不変なヘルプを作成する)、スレッドの通信方法を決定する必要があります(Handler/ConcurrentLinkedQueue/LinkedBlockingQueue?)。 –