Domanda

Ho ricevuto alcune domande su atomicreference.compareandet () Metodo, secondo il DOC, ha detto:

.

Imposta atomicamente il valore sul valore aggiornato specificato se il valore corrente== il valore atteso.

Per quanto ho capito, l'operatore == confronta l'indirizzo di due oggetti, se sì, come funzionerà in esempi come questo

private AtomicReference<AccessStatistics> stats =
    new AtomicReference<AccessStatistics>(new AccessStatistics(0, 0));
public void incrementPageCount(boolean wasError) {
    AccessStatistics prev, newValue;
    do {
        prev = stats.get();
        int noPages = prev.getNoPages() + 1;
        int noErrors = prev.getNoErrors;
        if (wasError) {
           noErrors++;
        }
        newValue = new AccessStatistics(noPages, noErrors);
    } while (!stats.compareAndSet(prev, newValue));
}
.

In questo snippet di codice, come deve sapere JVM quali campi AccessStatistics devono essere confrontati nel compareAndSet()?In effetti mi chiedo solo come è tutta questa strategia che funziona con Java non consente di ignorare affatto ==? Grazie per qualsiasi commento!

È stato utile?

Soluzione

.

Come fa JVM che conosce i campi di accesso per essere confrontati nel confrontoAndsETSET ()?

no. Non si confronta i campi nell'oggetto. Sta solo confrontando il riferimento dell'oggetto che è ciò che dice la documentazione. È proprio come funziona la classe AtomicReference. Come menzione dal Javadocs , utilizza == e non il metodo equals().

.

Imposta atomicamente il valore sul valore aggiornato specificato se il valore corrente== il valore atteso.

Tutte le classi Atomic* hanno funzioni simili. Ti consente di impostare atomicamente i valori mentre è sicuro che un altro thread non sovrascrivi il valore. Con compareAndSet(...) è necessario specificare il riferimento dell'oggetto corrente per assicurarti di aggiornare come previsto.

Nel tuo snippet di codice, sta cercando di aggiungere un oggetto immutabile di accesso ad accesso. Quindi ottiene il valore corrente, aggiunge ad esso, e quindi memorizza la nuova statistica sul riferimento. Se un altro thread memorizzato le sue statistiche tra quell'ora, allora il compareAndSet restituirà falso e lo su loop e ci riprodurrà di nuovo. Ciò risolve le condizioni di razza senza dover avere un blocco synchronized.

Altri suggerimenti

Il JVM non confronta i campi.IT Just Confronta se è lo stesso riferimento, lo stesso puntatore in memoria o qualsiasi cosa tu voglia chiamarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top