java - ReentrantLock和Condition实现生产者-消费者

本文详细介绍了Java中使用ReentrantLock和Condition实现生产者-消费者的机制。讨论了ReentrantLock的特点,如可重入、可中断和定时等待,并对比了与Object监视器方法的区别。接着,通过示例展示了如何创建条件队列,以及生产者和消费者线程的运行过程。最后,给出了测试结果和代码存放位置。
摘要由CSDN通过智能技术生成

java - ReentrantLock和Condition实现生产者-消费者

ReentrantLock

重入锁(ReentrantLock)是一种递归无阻塞的同步机制。

一个可重入的互斥锁(Lock),它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。
1. ReentrantLock 将由当前已经成功获得锁,并且还没有释放锁的线程所拥有。
2. 使用lock获得锁,unlock释放锁。
3. 可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查当前线程是否获得锁及调用了几次

lock

  1. 当锁没有被任何线程获得时,调用lock方法的线程将成功获的锁定并返回,将锁的保持计数设置为 1。
  2. 如果当前线程已经获得该锁(重复获取锁),则将保持计数加 1,并且该方法立即返回。
  3. 如果该锁已经被另一个线程获得,则出于线程调度的目的,将当前线程阻塞,并且在获得锁之前,该线程将一直处于休眠状态。

Condition

参考文章:怎么理解Condition

任何一个Java对象,都拥有一组监视器方法,主要包括wait()、notify()、notifyAll()方法,这些方法与synchronized关键字配合使用可以实现等待/通知机制。类似地,Condition接口也提供类似的Object的监视器的方法,主要包括await()、signal()、signalAll()方法,这些方法与Lock锁配合使用也可以实现等待/通知机制。

Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。传统线程的通信方式,Condition都可以实现,这里注意,Condition是被绑定到Lock上的,要创建一个Lock的Condition必须用newCondition()方法。

相比Object实现的监视器方法,Condition接口的监视器方法具有一些Object所没有的特性:
1. Condition接口可以支持多个等待队列,在前面已经提到一个Lock实例可以绑定多个Condition,所以自然可以支持多个等待队列了
2. Condition接口支持响应中断,前面已经提到过
3. Condition接口支持当前线程释放锁并进入等待状态到将来的某个时间,也就是支持定时功能

和Object监视器区别

这里写图片描述

Condition支持在await时不响应Thread的interrupt请求(awaitUninterruptibly方法):
这里写图片描述

Condition支持的定时唤醒功能(不同于Object的带参wait方法,这里的定时指在指定日期唤醒):

    boolean awaitUntil(Date deadline) throws InterruptedException;

实现生产者-消费者

示例使用 jdk 1.8,用Consumer接口表示消费者,Supplier[]数组表示待生产的产品

关键成员变量

    private final Lock lock = new ReentrantLock();

    //要生产的“货物”及其生产方式
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值