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

La diferencia entre ReentrantLock y sincronización en Java

Hay dos métodos para bloquear recursos compartidos mediante múltiples hilos. Uno es el bloqueo reentrante (Or ReadWriteLock), y el otro es usar el método Synchronized.

Java 5La clase ReentrantLock se proporciona en el paquete de concurrencia de Java. 

Es una implementación de Lock interface, según java docs, las implementaciones de Lock interface proporcionan operaciones más amplias que las que se pueden obtener utilizando métodos sincronizados.

NúmeroClaveCerradura reentranteSincronizado
1
Obtener cerraduras 
La clase de cerradura reentrante proporcionalock()Métodos para obtener cerraduras de recursos compartidos a través de hilos 
Solo necesita escribir la palabra clave synced para obtener la cerradura  
2
Liberación de cerraduras 
Para liberar la cerradura, el programador debe llamarunlock()Método
Finalización implícita 
3
 Capacidad de interrupción
El método lockInterruptible() se puede usar para interrumpir un hilo  
No hay manera de interrumpir un hilo
4
Equidad 
Este constructor tiene un parámetro de equidad. Si se establece en true, se otorgará el bloqueo a los que han esperado más tiempo *Derechos de acceso de hilos

Las cerraduras no garantizan ningún derecho de acceso específico
5
Orden de liberación de cerraduras 
Las cerraduras pueden liberarse en cualquier orden 
Las cerraduras deben liberarse en el orden en que se obtuvieron 

Ejemplo de ReentrantLock

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

Ejemplo de SynchronizedLock

public class SynchronizedLockExample implements Runnable{
   @Override
   public void run() {
      synchronized (resource) {
         //Bloquear algunos recursos
      }
   }
}