2016-10-14 1 views
0

私はAndroidプロジェクトにリファクタリングを行っています。私はスレッドセーフではないと考える奇妙なコードを見つけた。私は、この例がランダムなクラッシュを引き起こす可能性があると考えていますか?アンドロイドハンドラはスレッドセーフですか?

public class SampleClass 
{ 
    Object foo = new Object(); 

    // foo can be set to null in the main thread 

    private Handler handler = new Handler() 
    { 
     public void handleMessage(Message msg) 
     { 
      if (foo == null) 
       return; 

      Thread.sleep(600,0); 

      // There is a chance foo has been set to null while the thread was asleep... 
      foo.doSomething(); 
     } 
    } 
} 

私はハンドラは、デフォルトでは、スレッドセーフであることを聞いていても、私がのhandleMessage機能とfooがnullに設定される可能性のある場所の内側にsynchronizedブロックを配置する必要があるだろうと思われます。

答えて

0

ルーパはスレッドが起きているときにのみメッセージをハンドラに渡すことができます。 'foo'はプライベートフィールドです。そのメソッドからのみアクセスすれば、それは正常です。

関連する問題