首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Condition:重入锁的好搭档

如果大家理解了方法和方法,就能很容易理解Condition对象了。它与方法和方法的作用是大致相同的。但是方法和方法和方法是与synchronized关键字合作使用的,而Condition是与重入锁相关联的。通过lock接口(重入锁就实现了这一接口)的方法可以生成一个与当前重入锁绑定的Condition实例。利用Condition对象,我们就可以让线程在合适的时间等待。或者在某一个特定的时刻得到通知,继续执行。

Condition接口提供的基本方法如下:

以下方法的含义如下:

方法会使当前线程等待,同时释放当前锁,当其他线程中使用方法或者方法时,线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。这和方法类似。

方法与方法基本相同,但是它并不会在等待过程中响应中断。

方法用于唤醒一个在等待中的线程,方法会唤醒所有在等待中的线程。这和方法很类似。

第3行代码通过lock生成一个与之绑定的Condition对象。第8行代码要求线程在Condition对象上进行等待。第24行代码由主线程main发出通知,告知等待在Condition上的线程可以继续执行了。

与方法和方法一样,当线程使用方法时,要求线程持有相关重入锁,在方法调用后,这个线程会释放这把锁。同理,在方法调用时,也要求线程先获得相关的锁。在方法调用后,系统会从当前Condition对象的等待队列中唤醒一个线程。一旦线程被唤醒,它会重新尝试获得与之绑定的重入锁,一旦成功获取,就可以继续执行了。因此,在signal()方法调用之后一般需要释放相关的锁,让给被唤醒的线程,让它可以继续执行。比如,在本案例中,第24行代码就释放了重入锁,如果省略25行,那么,虽然已经唤醒了线程t1,但是由于它无法重新获得锁,因而也就无法真正的继续执行。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201011A000ZD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券