Java ReentrantLock详解
- 编程知识
- 2023-05-25
- 8
一、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条件等方式。