【Java面试】通过安检的例子理解什么是可重入锁

相信大家安检的时候最讨厌的就是两类人,一类是违禁物品非常多又恰巧在你前面、另一类就是插队的人,而这两类人恰好解释了可重入锁。


看图理解

现在安检的准备去安检的门前有一个大包小包A,老实巴交B,还有一个严厉的安检员S。

可重入锁1-公平锁模型
A来得比较早,所以正好排在了最前头,但是他的东西实在太多了,一个个一个的放进去安检机。

这时候B看到也来到了安检门前,但还不到他安检,因为前面的大包小包A一会儿被S叫A拿一下揹包里的水壶,一会儿叫拿一下腰包里的打火机,一会儿又叫拿钱包里的蝴蝶刀,违禁物品疯狂的递增。
B看这架势心里想:“得,可以休息一会儿了。”

可重入锁2
于是低头开始玩手机,前面的老哥所有的违禁物品都检查完了,可以通过了,这时候后面来了一个趁虚而入C。

可重入锁3-非公平锁模型
C说:“兄弟,你看我快赶不上火车,您让我先来成不。”

总结

第一个人A因为没有人和他抢,根据公平锁模型,自然而然的成为了队伍的第一个人,后面来的人就只能在线外等待前一个人的检查。
图中的待检查数就是我们目前锁的数量,前面的人看起来只有一个人,但是他身上有可能有很多是我们看不到的需要被检查的待检查物品,类似我们方法内部的实现,我们并知道他内部是否加了锁,每次被检查一个新的物品我们的数值就+1,然后一个个检查通过了,直到最后把所有的锁都解开了,才能进行下一个人的检查,也就是这个数值又归为0了。
这个时候所有人除了等得不耐烦的B埋头玩手机,恰好又来了一个C,因为唤醒B需要一定的时间,根据非公平锁模型,C正好在这个时候趁虚而入了,抢占到了这个位置,当然如果这时候B反应够快,也是有可能抢占到这个位置的。


参考资料

轻松学习java可重入锁(ReentrantLock)的实现原理


文章中出现的任何错误欢迎指正,共同进步!

最后做个小小广告,有对WEB开发和网络安全感兴趣的,可以加群一起学习和交流!

交流群
QQ:425343603

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章