ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。它添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。
ReentrantLock在同一个时间点只能被一个线程获取(当某线程获取到“锁”时,其它线程就必须等待)。
ReentrantLock分为“公平锁”和“非公平锁”。在公平锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上则允许“插队”。
ReentraantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。在“公平锁”的机制下,线程依次排队获取锁;而“非公平锁”在锁是可获取状态时,不管自己是不是在队列的开头都会获取锁。
1、防止重复执行(忽略重复触发)
ReentrantLock lock = new ReentrantLock(); if (lock.tryLock()) { //如果已经被lock,则立即返回false不会等待,达到忽略操作的效果 try { //操作 } finally { lock.unlock(); } }
2、同步执行,类似synchronized
ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(true); //公平锁 lock.lock(); //如果被其它资源锁定,会在此等待锁释放,达到暂停的效果 try { //操作 } finally { lock.unlock(); }
3、尝试等待执行
ReentrantLock lock = new ReentrantLock(true); //公平锁 try { if (lock.tryLock(5, TimeUnit.SECONDS)) { //如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行 try { //操作 } finally { lock.unlock(); } } } catch (InterruptedException e) { e.printStackTrace(); //当前线程被中断时(interrupt),会抛InterruptedException }
4、可中断锁的同步执行
ReentrantLock lock = new ReentrantLock(true); //公平锁 lock.lockInterruptibly(); try { //操作 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
Condition:
Condition是在java1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作。相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。
调用Condition的await()和signal()方法,都必须在lock保护之内。
Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。wait和notify是和synchronized关键字配合使用的。
public class MessageService { private Lock lock = new ReentrantLock(); private boolean flag = false; private Condition condition = lock.newCondition(); private int number = 1; /** * 生产者 */ public void produce() { lock.lock(); try { while (flag == true) { //等待通知进行生产 condition.await(); } System.out.println(Thread.currentThread().getName() + "-----生产-----"); number++; System.out.println("number: " + number); TimeUnit.MILLISECONDS.sleep(1000); flag = true; //通知进行消费 condition.signalAll(); } catch (InterruptedException ex) { ex.printStackTrace(); } finally { lock.unlock(); } } /** * 消费者 */ public void consume() { lock.lock(); try { while (flag == false) { //等待通知进行消费 condition.await(); } System.out.println(Thread.currentThread().getName() + "-----消费-----"); number--; System.out.println("number: " + number); TimeUnit.MILLISECONDS.sleep(1000); flag = false; //通知进行生产 condition.signalAll(); } catch (InterruptedException ex) { ex.printStackTrace(); } finally { lock.unlock(); } } }
相关推荐
ReentrantLock的使用及注意事项
主要介绍了Java中的显示锁ReentrantLock使用与原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析...
可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,...ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景;
Lock、Synchoronized和ReentrantLock的使用
java语言 并发编程 ReentrantLock与synchronized区别 详解
这份资源旨在详细讲解 Java 中的 Locks 框架,特别关注 ReentrantLock 的使用和原理。Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks ...
什么是公平锁和非公平锁 公平与非公平的一个很本质的区别就是,是否遵守FIFO(也就是先来后到)。当有多个线程来申请锁的时候,是否先申请的线程先获取锁,后申请的线程后获取锁?如果是的,则是 公平锁 ,否则是...
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
使用ReentrantLock和Lambda表达式让同步更纯净Java开发Java经验技巧共5页.pdf.zip
一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个...
ReentrantLock源码剖析
深入java并发编程,使用ReentrantLock和 Synchronized加锁
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重...
ReentrantLock类可以唤醒指定条件的线程,而object的唤醒是随机的 Condition类和Object类 Condition类的awiat方法和Object类的wait方法等效 Condition类的signal方法和Object类的notify方法等效 Condition类...
ReentrantLock 实现原理 1
助于理解的例子 博文链接:https://uule.iteye.com/blog/1488356
ReentrantLock lock方法注释
NULL 博文链接:https://patrick002.iteye.com/blog/2170391
近日,阅读jdk并发包源码分析整理笔记。