欢迎来到 钦州市某某软件有限责任公司
全国咨询热线:020-123456789
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

新闻中心
并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础
  来源:钦州市某某软件有限责任公司  更新时间:2024-05-08 12:39:14

并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

欢迎来到《并发王者课》,并发本溯本文是课铂该系列文章中的第14篇。

黄金系列中,金探接口我们介绍了并发中一些问题,何说比如死锁 、中锁活锁 、并发本溯线程饥饿等问题。课铂在并发编程中 ,金探接口这些问题无疑都是何说需要解决的。所以 ,中锁在铂金系列文章中 ,并发本溯我们会从并发中的课铂问题出发,探索Java所提供的金探接口锁的能力以及它们是如何解决这些问题的。

作为铂金系列文章的何说第一篇,我们将从Lock接口开始介绍 ,中锁因为它是Java中锁的基础,也是并发能力的基础  。

在青铜系列文章中,我们介绍了通过关键字实现对方法和代码块加锁的用法 。然而,虽然非常好用 、易用,但是它的灵活度却十分有限,不能灵活地控制加锁和释放锁的时机。所以 ,为了更灵活地使用锁  ,并满足更多的场景需要 ,就需要我们能够自主地定义锁 。于是 ,就有了Lock接口  。

理解Lock最直观的方式 ,莫过于直接在JDK所提供的并发工具类中找到它,如下图所示:

可以看到,Lock接口提供了一些能力API,并有一些具体的实现,如ReentrantLock、ReentrantReadWriteLock等 。

  •  :获取锁。如果当前锁不可用  ,则会被阻塞直至锁释放
  •  :获取锁并允许被中断 。这个方法和类似,不同的是,它允许被中断并抛出中断异常 。
  •  :尝试获取锁 。会立即返回结果,而不会被阻塞 。
  • :尝试获取锁并等待一段时间。这个方法和  ,但是它会根据参数等待–会,如果在规定的时间内未能获取到锁就会放弃
  •  :释放锁 。

在Java并发工具类中 ,Lock接口有一些实现 ,比如 :

  • ReentrantLock:可重入锁;
  • ReentrantReadWriteLock:可重入读写锁;

除了列举的两个实现外,还有一些其他实现类 。对于这些实现 ,暂且不必详细了解  ,后面会详细介绍。在目前阶段 ,你需要理解的是Lock是它们的基础 。

接下来,我们基于前面的示例代码 ,看看如何将版本的锁用Lock来实现。

创建类WildMonsterLock并实现Lock接口,WildMonsterLock将是取代的关键  :

在实现Lock接口时 ,你需要实现它上述的所有方法 。不过,为了简化代码方便展示,我们移除了WildMonsterLock类中的等方法。

对于和方法的时候 ,如果你不熟悉的话,可以查看青铜系列的文章。这里需要提醒的是,在使用时务必要和是同一个监视器。

基于刚才定义的WildMonsterLock ,创建WildMonster类 ,并在方法killWildMonster中使用WildMonsterLock对象  ,从而取代synchronized.

输出结果如下:

从结果中可以看到 :只有哪吒一人斩获了野怪,其他几个英雄均以失败告终  ,结果符合预期。这说明  ,WildMonsterLock达到了和一致的效果。

不过  ,这里有细节需要注意 。在使用时我们无需关心锁的释放 ,JVM会帮助我们自动完成 。然而 ,在使用自定义的锁时  ,一定要使用来确保锁最终一定会被释放,否则将造成后续线程被阻塞的严重后果 。

在中,锁是可以重入的。所谓锁的可重入,指的是锁可以被线程重复或递归调用。比如,加锁对象中存在多个加锁方法时,当线程在获取到锁进入其中任一方法后,线程应该可以同时进入其他的加锁方法 ,而不会出现被阻塞的情况  。当然 ,前提条件是这个加锁的方法用的是同一个对象的锁(监视器)。

在下面这段代码中 ,方法A和B都是同步方法 ,并且A中调用B. 那么 ,线程在调用A时已经获得了当前对象的锁 ,那么线程在A中调用B时可以直接调用 ,这就是锁的可重入性 。

所以,为了让我们自定义的WildMonsterLock也支持可重入,我们需要对代码进行一点改动  。

在新的WildMonsterLock中,我们增加了和字段,并在加锁和解锁时增加对线程的判断。在加锁时,如果当前线程已经获得锁,那么将不必进入等待。而在解锁时,只有当前线程能解锁 。

字段则是为了保证解锁的次数和加锁的次数是匹配的 ,比如加锁了3次,那么相应的也要3次解锁。

在黄金系列文章中,我们提到了线程在竞争中可能被饿死,因为竞争并不是公平的。所以,我们在自定义锁的时候,也应当考虑锁的公平性。

以上就是关于Lock的全部内容。在本文中,我们介绍了Lock是Java中各类锁的基础 。它是一个接口 ,提供了一些能力API ,并有着完整的实现。并且,我们也可以根据需要自定义实现锁的逻辑 。所以,在学习Java中各种锁的时候,最好先从Lock接口开始 。同时,在替代synchronized的过程中,我们也能感受到Lock有一些synchronized所不具备的优势 :

  • synchronized用于方法体或代码块,而Lock可以灵活使用,甚至可以跨越方法

  • synchronized没有公平性 ,任何线程都可以获取并长期持有,从而可能饿死其他线程 。而基于Lock接口,我们可以实现公平锁,从而避免一些线程活跃性问题

  • synchronized被阻塞时只有等待,而Lock则提供了方法,可以快速试错 ,并可以设定时间限制,使用时更加灵活

  • synchronized不可以被中断,而Lock提供了方法 ,可以实现中断。

另外 ,在自定义锁的时候,要考虑锁的公平性 。而在使用锁的时候 ,则需要考虑锁的安全释放 。

夫子的试炼

  • 基于Lock接口,自定义实现一把锁 。

延伸阅读与参考资料

  • Locks in Java
  • 《并发王者课》大纲与更新进度总览

关于作者

关注公众号【庸人技术笑谈】 ,获取及时文章更新。记录平凡人的技术故事 ,分享有品质(尽量)的技术文章 ,偶尔也聊聊生活和理想。不贩卖焦虑 ,不做标题党。

如果本文对你有帮助,欢迎点赞、关注、监督,我们一起从青铜到王者。


友情链接lol赵信重做怎么玩?lol赵信重做技能天赋出装玩法DNF泰拉追忆礼包:12强化11增幅深渊骑士,绝版泰拉石高清魔剑完全破解的gm无限资源手游-免费0元gm权限破解免内购手游LOL6月8日更新公告 6.11版本改动内容一览阴阳师攻略大全dnf110级版本魔道怎么加点2023魔道加点推荐盘丝岭阴阳师召唤阵怎么用 专用ssr召唤阵推荐DOTA2影魔最搭配和最克制英雄详解变态网游手游平台推荐 十大变态网游手游平台排行榜【摩尔庄园】植物用途,加速上手原创《天天向上》在韩热播,当看到王一博头上的网巾时,韩媒不淡定了《光遇》2022年圣诞节礼包内容介绍火炬之光2——属性点重置攻略《洛克王国》水灵石怎么获得?水灵石获取方式汇总原神鱼饵配方怎么获取 鱼饵配方获取攻略LOL:新版努努W技能实测,网友:原来这个技能这么BUG原创它是赛尔号曾经的梦想,比谱尼还难打,现库贝萨隆无脑过!dnf怎么偷学技能(阿尔伯特偷学技能任务怎么完成)王者荣耀关键时间节点(王者荣耀蓝buff刷新时间多少秒)《我的世界》超实用的10个红石装置,看完感觉自己不配玩MC!《DNF手游》泰拉石作用介绍 泰拉石有什么作用《英雄联盟》2022新英雄排期揭晓变态网游手游平台推荐 十大变态网游手游平台排行榜保卫萝卜2第86关攻略 隐藏炮塔立大功《唐家寺的雨伞》阅读题的答案可以挂机玩的单机游戏有哪些2023 热门的挂机手游大全wow魔兽世界10.0黑市多久刷新一次时间介绍原创DNF:刃影不用玩了!最大优势惨遭和谐,女角色不准背对玩家?二年级家长分享教育孩子经验14篇守望先锋里源氏说的日语都是什么意思?nba2k14,2k15,2k16,2k17,2k18,2k19,那个最好玩?如果要排行你怎么排?DNF手游漫游怎么加点推荐DNF剑豪百科全书 加点装备时装全面解读武神怎么堆物攻,dnf武神要力量还是物攻DNF怎么进黄龙大会 进入黄龙大会的方法条件一览《LOL》S10狼人装备搭配2023dnf最新战法加点图解 dnf战法怎么养成在别的游戏里,像我这么帅的一般都是主角呀win10系统下QQ飞车,登录不了客户端,一直闪退提示游戏环境异常
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

0.4292

Copyright © 2024 Powered by 钦州市某某软件有限责任公司   sitemap