相信大家安检的时候最讨厌的就是两类人,一类是违禁物品非常多又恰巧在你前面、另一类就是插队的人,而这两类人恰好解释了可重入锁。
看图理解
现在安检的准备去安检的门前有一个大包小包A,老实巴交B,还有一个严厉的安检员S。
A来得比较早,所以正好排在了最前头,但是他的东西实在太多了,一个个一个的放进去安检机。
这时候B看到也来到了安检门前,但还不到他安检,因为前面的大包小包A一会儿被S叫A拿一下背包里的水壶,一会儿叫拿一下腰包里的打火机,一会儿又叫拿钱包里的蝴蝶刀,违禁物品疯狂的递增。
B看这架势心里想:“得,可以休息一会儿了。”
于是低头开始玩手机,前面的老哥所有的违禁物品都检查完了,可以通过了,这时候后面来了一个趁虚而入C。
C说:“兄弟,你看我快赶不上火车,您让我先来成不。”
总结
第一个人A因为没有人和他抢,根据公平锁模型,自然而然的成为了队伍的第一个人,后面来的人就只能在线外等待前一个人的检查。
图中的待检查数就是我们目前锁的数量,前面的人看起来只有一个人,但是他身上有可能有很多是我们看不到的需要被检查的待检查物品,类似我们方法内部的实现,我们并知道他内部是否加了锁,每次被检查一个新的物品我们的数值就+1,然后一个个检查通过了,直到最后把所有的锁都解开了,才能进行下一个人的检查,也就是这个数值又归为0了。
这个时候所有人除了等得不耐烦的B埋头玩手机,恰好又来了一个C,因为唤醒B需要一定的时间,根据非公平锁模型,C正好在这个时候趁虚而入了,抢占到了这个位置,当然如果这时候B反应够快,也是有可能抢占到这个位置的。
参考资料
轻松学习java可重入锁(ReentrantLock)的实现原理
文章中出现的任何错误欢迎指正,共同进步!
最后做个小小广告,有对WEB开发和网络安全感兴趣的,可以加群一起学习和交流!
QQ:425343603