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

Java高级进阶多线程学习之路(八)ReentrantLock

ReentrantLock是一个可以替代synchronized的锁,我们来简单聊聊ReentrantLock的一些方法和如何使用。

先来说说可重入,这个之前写的文章里也有写到,这里写的例子是一个类两个加锁方法要使用同一把锁,是可以使用的。其实比较好理解重入这个概念的是 子类重写父类的加锁方法,这时候一般我们会用super.父类的方法,那如果锁不可重入,就会死锁,你品,细细品。所以这两个锁是可重入的。

ReentrantLock有一个tryLock的方法,顾名思义就是尝试锁定,不管是否能拿到锁,都会继续执行。这个就类似wait,这里你在实际应用中可以给tryLock设置时间,比如尝试5秒不行就拉倒。

ReentrantLock还可以作为公平锁来使用,实例化时写true就是公平锁,false为非公平锁,默认为非公平锁。,而synchronized不可以。什么是公平锁呢,与非公平锁有什么区别呢?简单来说吧,比如说我们去水井打水喝,打水时,以家庭为单位,哪个家庭任何人先到井边,就可以先打水,其家里人这时候过来打水就不需要排队。而那些没有抢占到打水权的人,就得一个一个挨着在井边排成一队,先到的排在前面。正在打水的人结束了,会让第二个人接着打水。

是不是看起来挺公平的,先到先得,当然不是绝对公平的,一个有娃的父亲正在打水,他的娃也到井边了,所以女凭父贵可以直接排到最前面去打水。这就是所谓的公平锁模型。

当然事情总是会有意外的,总会有人想走捷径,新来打水的人,他们看到有人排队打水,他们好好去排队,反之,他们会看看现在有没有人正在打水,如果有人在打水,没辄了,只好排到队列最后面去,但是如果这时候前面打水的人刚刚打完水,正在交接中,排在队头的人还没有完成交接工作,这时候,新来的人可以尝试抢打水权,如果抢到了,呵呵,其他人也只能睁一只眼闭一只眼,因为大家都默认这个规则了。这就是所谓的非公平锁模型。新来的人不一定总得乖乖排队,这也就造成了原来队列中排队的人可能要等很久很久。

如果写的有问题还请各位大佬指正

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券