通过查看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)

GpsLocationProviderThreadGpsLocationProvider的内部类,mHandlerGpsLocationProvider的成员实例变量。此变量是在该线程的run()方法中设置的,但是未应用任何同步,并且mHandler不是volatile

为什么这样做?即使此方法有99%的时间能奏效,也不能总是保证它能奏效,这当然也不是一种好习惯。我是否理解正确,还是我误会了此代码的某些细微之处?

最佳答案

线程是在提供程序创建时(在其构造函数中)创建的,并且mInitializedLatch确保构造函数仅在线程启动并运行后才继续进行。

此后,将创建mHandler并使其有效,并且由于Handler类的方法是可重入的,因此该系统应是线程安全的。毕竟,处理程序是一个专为线程间通信而设计的类。

07-26 04:06