当前位置:首页 > 编程知识 > 正文

Java ReentrantLock详解

一、ReentrantLock简介

Java中的ReentrantLock是一个独占锁,它是比synchronized更强大的工具。ReentrantLock在多线程环境下可以保证数据的安全性,允许多个线程同时访问一个资源,但是只有一个线程在实际执行中可以访问它。

二、ReentrantLock的使用方式

ReentrantLock的使用比synchronized更加灵活,主要提供以下几种方式:

1、ReentrantLock的普通使用

示例代码如下:

public class ReentrantLockTest{  
   private ReentrantLock lock = new ReentrantLock();  
   public void testReentrantLock(){  
      lock.lock();  
      try {  
         //do something
      } finally {  
         lock.unlock();  
      }  
   }  
}  

2、ReentrantLock的tryLock()

示例代码如下:

public class ReentrantLockTest{  
   private ReentrantLock lock = new ReentrantLock();  
   public void testReentrantLock(){  
      if(lock.tryLock()){  
         try {  
            //do something
         } finally {  
            lock.unlock();  
         }  
      } else {  
         //do something
      }  
   }  
}  

3、ReentrantLock的tryLock(long timeout, TimeUnit unit)方法

示例代码如下:

public class ReentrantLockTest{  
   private ReentrantLock lock = new ReentrantLock();  
   public void testReentrantLock(){  
      try {  
         if (lock.tryLock(3, TimeUnit.SECONDS)) {  
            try {  
               //do something
            } finally {  
               lock.unlock();  
            }  
         } else {  
            //do something
         }  
      } catch (InterruptedException e) {  
            //do something
      }  
   }  
}  

4、ReentrantLock的公平锁和非公平锁默认是非公平锁

示例代码如下:

public class ReentrantLockTest{  
   private ReentrantLock fairLock = new ReentrantLock(true);  
   private ReentrantLock nonfairLock = new ReentrantLock();  
}  

5、ReentrantLock的condition

示例代码如下:

public class ReentrantLockTest{  
   private ReentrantLock lock = new ReentrantLock();  
   private Condition condition = lock.newCondition();  
   public void testReentrantLock(){  
      try {  
         lock.lock();  
         //do something
         condition.signal();  
      } finally {  
         lock.unlock();  
      }  
   }  
}  

三、ReentrantLock与synchronized的区别

ReentrantLock和synchronized都是用来进行同步的,但是它们之间还是有不同的地方。具体来说,ReentrantLock相对于synchronized的优势主要包括:

1、ReentrantLock是可重入锁

ReentrantLock允许线程在获得锁之后再次获得该锁,而synchronized不允许公平的重入锁。

2、ReentrantLock是可中断锁

ReentrantLock提供了lockInterruptibly()方法,可以响应线程的中断请求,而synchronized没有提供这样的机制。

3、ReentrantLock提供了限时的锁等待功能

ReentrantLock提供了tryLock(long timeout, TimeUnit unit)方法,可以在等待一段时间之后放弃获取锁,而synchronized不允许这样的机制。

4、ReentrantLock可以选择公平锁或非公平锁

ReentrantLock提供了两种锁的方式,公平锁和非公平锁,而synchronized只能使用非公平锁。

5、ReentrantLock提供了condition条件

ReentrantLock提供了wait和notify方法相应的条件管理方式,通过创建多个Condition为锁,分别进行通知和等待操作,可以实现更加细粒度的控制。

四、总结

ReentrantLock作为Java中同步的基本工具之一,具有synchronized无法替代的优势。它提供了可重入锁、可中断锁、限时的锁等待功能、公平锁和非公平锁以及condition条件等方式。