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

Unterschied zwischen ReentrantLock und Synchronisation in Java

Es gibt zwei Methoden, um gemeinsame Ressourcen über mehrere Threads zu sperren. Eine ist der ReentrantLock (oder ReadWriteLock), die andere ist die Verwendung von Synchronized-Methode.

Java 5Die Klasse ReentrantLock wird im Java Concurrent-Paket bereitgestellt. 

Es ist eine Implementierung des Lock-Interfaces. Laut java docs bieten die Implementierungen des Lock-Interfaces breitere Operationen als die Verwendung von Synchron-Methoden.

NummerSchlüsselWiedereinsetzbares SchlossSynchronisiert
1
Schlüssel erwerben 
Die Klassen für wiedereinsetzbare Schlösser bietenlock()Methoden, um den Shared Resource Lock durch den Thread zu erhalten 
Sie müssen nur den Schlüssel 'synced' schreiben, um den Schließvorgang zu erhalten  
2
Freigabe des Schlosses 
Um den Schließvorgang freizugeben, muss der Programmierer aufgerufen werdenunlock()Methode
Implizit abgeschlossen 
3
 Unterbrechungsfähigkeit
Das lockInterruptible() -Verfahren kann verwendet werden, um einen Thread zu unterbrechen  
Es gibt keine Möglichkeit, einen Thread zu unterbrechen
4
Fair 
Dieser Konstruktor hat einen fairen Parameter. Wenn er auf true gesetzt wird, wird der Schließvorgang denjenigen zugewiesen, der am längsten wartet *Zugriffsberechtigung der Threads

Die Schlüssel garantieren keine bestimmte Zugriffsberechtigung
5
Freigabereihenfolge der Schlüssel 
Die Schlüssel können in beliebiger Reihenfolge freigegeben werden 
Die Schlüssel sollten in der Reihenfolge ihres Erhalts freigegeben werden 

Beispiel für ReentrantLock

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

Beispiel für SynchronizedLock

public class SynchronizedLockExample implements Runnable{
   @Override
   public void run() {
      synchronized (Ressource) {
         //Einige Ressourcen sperren
      }
   }
}