2010-12-01 11 views
2

に同期ブロック内から設定されていない、私はこれに遭遇しましたJava/COM /アンドロイド/内部/位置/ GpsLocationProvider.java)mHandlerは、AndroidのSDKのAndroid SDKのフレームワークのソースコードを見ると

GpsLocationProviderThreadGpsLocationProviderの内部クラスであり、mHandlerGpsLocationProviderのメンバーインスタンス変数です。この変数はこのスレッドのrun()メソッド内から設定されますが、同期は適用されず、mHandlervolatileではありません。

これはなぜ機能しますか?そして、これが機能する時間の99%でも、必ずしも動作するとは限らず、確かに良い習慣ではありません。私はこの理解を訂正していますか、または私が誤解しているこのコードには微妙なものがありますか?

+0

なぜ機能しないのですか?他のスレッドはmHandlerにアクセスしていますか?もっと文脈が必要です。 – EboMike

+0

はい、mHandlerはメインスレッドまたはUIスレッドである外部スレッドからアクセスされます。 – skyler

答えて

1

プロバイダが(コンストラクタ内で)作成されるとスレッドが作成され、mInitializedLatchは、スレッドが起動して実行されるとコンストラクタが確実に実行されるようにします。

その後、mHandlerが作成され、有効であり、Handlerクラスのメソッドはリエントラントなので、このシステムはスレッドセーフである必要があります。結局、Handlerはスレッド間通信用に設計されたクラスです。

+0

これは古い質問ですが、ここではskylerが見ていた 'GpsLocationProvider'ファイルの' mHandler'の回りに 'synchronized'ブロックの使用に関する検索を同時に実行しました。私はskylerがなぜ質問するのか理解していると思います。コードの他の部分では、 'mHandler'は' synchronized'で囲まれていますが、質問に表示されているコードのブロックではありません。私の結論は、@EboMikeが説明する理由で引用符で囲まれたコードは同期を必要としないが、 'mHandler'の他の参照はパブリックメソッドであるため同期されているということです。 – Trevor

+0

...そして、 'mHandler'をロックとして使用している間に、' mHandler'への呼び出しを同期させる必要のあるパブリックメソッドの理由は、私が知る限り、それらのパブリックメソッドへの並行呼び出しを防ぐためです。そのようなパブリックメソッドの少なくとも1つが 'mHandler'へのいくつかの呼び出しを行い、その間に' mHandler'を呼び出すことなくアトミック操作として行われなければならないので、そうしないと悪いことになります。とにかくそれは私の信念ですが、さらなるコメントを歓迎します。 – Trevor

関連する問題