[JAVA] Reentrant Lock garantit l'ordre

Notes personnelles. Lorsque j'ai recherché le contrôle exclusif Java, j'ai trouvé l'article suivant. Java synchronisé ne garantit pas l'ordre. Comme mentionné dans l'article, le verrouillage avec "synchronisé" ne garantit pas l'ordre de libération lorsque plusieurs verrous sont effectués en même temps. Si vous ne le comprenez pas, vous risquez de rester bloqué à certains endroits. Comme solution de contournement pour moi, j'ai remplacé le mécanisme de verrouillage de synchronized à java.util.concurrent.locks.ReentrantLock.

Utiliser ReentrantLock

//Le constructeur est juste=Spécifiez avec vrai
//L'instance de verrouillage est utilisée entre les threads qui sont contrôlés exclusivement
ReentrantLock lock = new ReentrantLock(true);
try {
    lock.lock();
    //Traitement pendant le contrôle exclusif
} finally {
    lock.unlock();
}

Automatisez l'acquisition et la libération des verrous

Je peux atteindre l'objectif même si je l'utilise tel quel. Contrairement à synchronized, il nécessite un déverrouillage explicite, et s'il est divulgué par inadvertance, cela peut conduire à une situation grave. J'ai donc créé un wrapper pour ReentrantLock et je l'ai forcé à utiliser des verrous et des déverrouillage par paires.

FairLock.java


public class FairLock {
    private ReentrantLock lock = new ReentrantLock(true);

    public void withSync(FairSyncTask task) {
        try {
            lock.lock();
            task.act();
        } finally {
            lock.unlock();
        }
    }

    public interface FairSyncTask {
        void act();
    }
}

Exemple d'utilisation


//Exemple écrit en synchronisé
private final Object syncObj = new Object();

public void actWithUnfair() {
    synchronized(syncObj) {
        //Traitement pendant le contrôle exclusif
    }
}

//Exemple remplacé par le wrapper ReentrantLock
private final FairLock fairLock = new FairLock();

public void actWithFair() {
    fairLock.withSync(() -> {
        //Traitement pendant le contrôle exclusif
    });
}

Résumé

Je me demande si je le savais. J'espère que cet article aide quelqu'un.

Recommended Posts

Reentrant Lock garantit l'ordre
À propos du verrouillage synchronisé et réentrant