通过查看Android SDK框架源代码,我发现了这一点:
private final class GpsLocationProviderThread extends Thread {
public GpsLocationProviderThread() {
super("GpsLocationProvider");
}
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
initialize();
Looper.prepare();
mHandler = new ProviderHandler();
// signal when we are initialized and ready to go
mInitializedLatch.countDown();
Looper.loop();
}
}
(这来自Froyo的frameworks / base / location / java / com / android / internal / location / GpsLocationProvider.java)
GpsLocationProviderThread
是GpsLocationProvider
的内部类,mHandler
是GpsLocationProvider
的成员实例变量。此变量是在该线程的run()
方法中设置的,但是未应用任何同步,并且mHandler
不是volatile
。为什么这样做?即使此方法有99%的时间能奏效,也不能总是保证它能奏效,这当然也不是一种好习惯。我是否理解正确,还是我误会了此代码的某些细微之处?
最佳答案
线程是在提供程序创建时(在其构造函数中)创建的,并且mInitializedLatch
确保构造函数仅在线程启动并运行后才继续进行。
此后,将创建mHandler并使其有效,并且由于Handler类的方法是可重入的,因此该系统应是线程安全的。毕竟,处理程序是一个专为线程间通信而设计的类。