第二个新对象!= Class.this in AtomicReference

时间:2016-08-09 16:05:53

标签: java android concurrency

我正在阅读一些处理gps坐标的android服务代码,并使用新的Object设置AtomicReference一次:

public class SingleLocationUpdateService extends ServicePart {
 private final AtomicReference<GPSUpdater> currentUpdater = new AtomicReference<>();
 @Override
protected boolean onStart() {
    lastSaverModeOn = mService.getSettings().getRootSettings().isSaverModeOn();
    if (mService.getSettings().getRootSettings().isStopMileageInWorkOn()) {
        if (lastSaverModeOn) {
            return false;
        }
    }

    singleUpdateSeconds = mService.getSettings().getRootSettings().getGpsRareUpdateSeconds();
    ***currentUpdater.set(new GPSUpdater());***
    mService.getExecutor().schedule(currentUpdater.get(), 10, TimeUnit.SECONDS);
    return true;
}

然后sheduler执行此操作:

private class GPSUpdater implements Runnable, LocationListener {

 @Override
    public void run() {
        if (!isCurrentRunning()) {
            return;
        }
        Log.d(TAG, "Requesting single location update");
        final LocationManager lm = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
        try {
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this, Looper.getMainLooper());
        } catch (Throwable t) {
            Log.e(TAG, "Failed to request single location update", t);
        }
        reschedule();
    }

    private boolean isCurrentRunning() {
        return isStarted() && currentUpdater.get() == GPSUpdater.this;
    }

    private void reschedule() {
        final LocationManager lm = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
        lm.removeUpdates(this);

        final GPSUpdater next = new GPSUpdater();

        if (isStarted() && currentUpdater.compareAndSet(GPSUpdater.this, next)) {
            Log.d(TAG, "Rescheduling single location updater");
            mService.getExecutor().schedule(next, 10, TimeUnit.SECONDS);
        }
    }

在调试器中,如果我运行currentUpdater.compareAndSet(GPSUpdater.this,next)1次,则返回true,因此表示新的GPSUpdater(在onStart()中设置)== GPSUpdater.this。然后将AtomicReference设置为next。但接下来也是新的GPSUpdater。但是,如果你2当时使用currentUpdater.compareAndSet(GPSUpdater.this,next),它将返回false。所以2次新的GPSUpdater!= GPSUpdater.this。如何正确解释?如果我创建2个新的对象引用 - 只有第一个将等于它的类引用?为什么? Thx提前。

1 个答案:

答案 0 :(得分:0)

您正在通过呼叫每个人new GPSUpdater()创建两个不同的类GPSUpdater对象。因此,如果要比较两个对象,最好使用equals()方法。如果您自己编写了GPSUpdate类,则可能需要覆盖equals()方法以产生适当的结果。我的意思是,如果定义两个对象相等,则equals应该返回true。 如果您使用==运算符来检查两个对象是否相同,那么将检查引用而不是真实的&#34;内容&#34;对象