我正在对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的任何地方。
答案 0 :(得分:0)
只有当线程处于唤醒状态时,Looper才能将Message传递给处理程序。 'foo'是一个私有字段,如果只从该方法访问它 - 那很好