Просматривая исходный код фреймворка 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();
}
}
(это из фреймворков / базы / location / java / com / android / internal / location / GpsLocationProvider в Froyo.java)
GpsLocationProviderThread
является внутренним классом GpsLocationProvider
, а mHandler
является переменной экземпляра члена GpsLocationProvider
.Эта переменная устанавливается в методе run()
этого потока, но синхронизация не применяется, и mHandler
не является volatile
.
Почему это работает?И даже если 99% времени это работает, это не всегда гарантирует работу, и это, конечно, не очень хорошая практика.Я прав в этом понимании, или в этом коде есть что-то тонкое, что я неправильно понимаю?