English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

La différence entre ReentrantLock et la synchronisation en Java

Il existe deux méthodes pour verrouiller des ressources partagées par plusieurs threads. L'une est le verrou réentrant (ou ReadWriteLock), et l'autre consiste à utiliser la méthode Synchronized.

Java 5La classe ReentrantLock est fournie dans le package Java concurrent. 

C'est une implémentation de l'interface Lock, selon les java docs, l'implémentation de l'interface Lock fournit des opérations plus larges que celles obtenues en utilisant les méthodes synchronisées.

NuméroCléVerrou réentrantSynchronisé
1
Obtenir un verrou 
La classe de verrou réentrant fournitlock()Les méthodes pour obtenir le verrou des ressources partagées par le thread 
Vous n'avez besoin que de la clé synced pour obtenir le verrou  
2
Libération du verrou 
Pour libérer le verrou, le programmeur doit appelerunlock()Méthode
Termination implicite 
3
 Capacité de rompre
La méthode lockInterruptible() peut être utilisée pour rompre un thread  
Il n'y a pas de moyen de rompre un thread
4
Équité 
Ce type de constructeur a un paramètre équitable. Si vous le définissez sur true, le verrou sera attribué au thread en attente le plus longtemps *Droits d'accès des threads

Les verrous ne garantissent pas un accès spécifique
5
Ordre de libération des verrous 
Les verrous peuvent être libérés dans n'importe quel ordre 
Les verrous doivent être libérés dans l'ordre d'acquisition 

Exemple de ReentrantLock

public class ReentrantLockExample implements Runnable{
   private Lock lock = new ReentrantLock();
   @Override
   public void run() {
      try {
         lock.lock()
         //Verrouiller certains ressources
      }
      catch (InterruptedException e) {
         e.printStackTrace();
      }
      finally {
         lock.unlock();
      }
   }
}

Exemple de SynchronizedLock

public class SynchronizedLockExample implements Runnable{
   @Override
   public void run() {
      synchronized (ressource) {
         //Verrouiller certains ressources
      }
   }
}
Vous pourriez aussi aimer