Maison  >  Article  >  Java  >  Qu'est-ce qu'un verrouillage injuste en Java

Qu'est-ce qu'un verrouillage injuste en Java

WBOY
WBOYavant
2023-04-29 08:52:12709parcourir

1. Un verrouillage injuste ne peut garantir que le verrouillage soit acquis dans l'ordre dans lequel le verrouillage est demandé. Cela peut avoir pour conséquence qu'un ou plusieurs threads n'obtiennent jamais le verrou.

2. Le coût du réveil des threads du processeur peut être réduit et l'efficacité globale du débit sera très élevée. Cependant, il peut y avoir des threads qui ne peuvent pas obtenir le verrou pendant une longue période, voire jamais, ce qui conduit à la famine.

Instances

    /**
     * Sync object for non-fair locks
     */
    static final class NonfairSync extends Sync {
        private static final long serialVersionUID = 7316153563782823691L;
 
        /**
         * Performs lock.  Try immediate barge, backing up to normal
         * acquire on failure.
         */
        final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }
 
        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
    }
 
    /**
     * Sync object for fair locks
     */
    static final class FairSync extends Sync {
        private static final long serialVersionUID = -3000897897090466540L;
 
        final void lock() {
            acquire(1);
        }
 
        /**
         * Fair version of tryAcquire.  Don't grant access unless
         * recursive call or no waiters or is first.
         */
        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer