2017-03-14 1 views
0

J'étudie java.util.concurrent.locks.AbstractQueuedSynchronizer le code source. De plusieurs endroits invoque la méthode compareAndSetState.unsafe.compareAndSwapInt premier argument menanig

/** 
* Atomically sets synchronization state to the given updated 
* value if the current state value equals the expected value. 
* This operation has memory semantics of a {@code volatile} read 
* and write. 
* 
* @param expect the expected value 
* @param update the new value 
* @return {@code true} if successful. False return indicates that the actual 
*   value was not equal to the expected value. 
*/ 
protected final boolean compareAndSetState(int expect, int update) { 
    // See below for intrinsics setup to support this 
    return unsafe.compareAndSwapInt(this, stateOffset, expect, update); 
} 

Paramètres expect et update sont évidents et correspondent aux paramètres Atomics. Mais this est Object (plutôt que int).
Comment cela se compare-t-il à attendre?

Répondre

0

C'est l'instance dont le champ state sera CAS-ed. La valeur est stockée dans ce champ. La paire instance-offset est un moyen de traduire le descripteur de champ en une adresse mémoire, tout comme vous devez fournir l'instance lorsque vous utilisez Field::set, Field::get ou Method::invoke. Btw, la source des classes de soleil est disponible en ligne au openjdk's mercury repository.

+0

Je ne sais toujours pas pour moi – gstackoverflow

+0

Comment AbstractQueuedSynchronizer peut avoir de la valeur? – gstackoverflow

+0

C'est le champ 'AbstractQueuedSynchronizer :: state', pas l'objet lui-même. – glee8e