所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

如何理解互斥锁、条件锁、读写锁以及自旋锁,它们的区别在哪?

发布时间:2020-04-12 08:44:42

资讯分类:自旋锁  读写锁  互斥锁  区别  线程  小便  执行
如何理解互斥锁、条件锁、读写锁以及自旋锁,它们的区别在哪?

学习复杂的技术一定要通过简单的生活事例去理解,和加深记忆,不然你绝对掌握不了!

锁用在高并发,多线程模型当中,用于解决共享资源的安全问题!防止数据错误!

下面分别用事例说下这几种锁机制:

1,互斥锁:也叫阻塞锁,就像上wc,同一个WC不可能容纳两个人(线程)同时进行吧?一个人在上的时候,把门关上了,另一个人只能一直等着,这就是互斥锁(只有一个能执行)!

2,条件锁:也叫条件变量锁,两个人去酒店吃饭,你去上WC的时候,发现里面有人(别的线程在执行)在上,敲了敲门,里面的人说:你先再去吃会,等我好了我叫你哈!然后你回去继续等着!(无竞争),等到他好了叫你了(唤醒线程),你才去继续执行!

3,读写锁:同一个场景,同一个坑位!酒店人太多了,上厕所挤不过来!怎么办呢?一块小便吧(同享同一个坑位,小便,读锁共享),但是上大号怎么办呢?还是只能一个人啊(写锁还是一个线程独占)!解决大量的小便阻塞坑位的问题!

4,自旋锁:还是同一个场景,同一个坑位!一个人已经占了坑了,但是你很急啊,要拉裤子了,怎么办呢?一直敲门(循环检索是否可以获得锁),同时说,我好急啊!直到里面的人不胜其烦出来了,你进去愉快的上厕所(执行线程)了!这个过程中你一直在敲门(一直使用CPU资源)!

还有定时锁,轮询锁,对象锁,类锁,显示锁,隐式锁等下次再举例吧!别问我为什么,因为你还没关注我....

如何理解互斥锁、条件锁、读写锁以及自旋锁,它们的区别在哪?

只要是程序员,不管是web开发还是软件开发,只要涉及到数据一致性等方面的操作,都离不开锁,而锁也分很多种,在数据库操作过程中,有乐观锁,悲观锁等等。下面,我们先对题主的问题进行讲解。

互斥锁

当共享的资源是互斥的时候,每当一个对象获得了资源的使用权的时候,就要对这个资源加锁,避免再背其他对象获取。这个时候,其他对象都会陷入阻塞状态,要等到有使用权的对象释放锁之后,才会唤醒目前排在第一位的下一个对象。

这个像很多学生排队等老师批作业。老师作为唯一资源,被很多对象(学生)需要,但是老师同时只能批改一个学生的随堂作业,因此当第一个完成作业的同学到讲台上的时候,他就占用了老师这个资源,相当于上了一个互斥锁。其他完成作业的同学,必须坐在座位上,等老师喊,“下一个”,才能有机会获取被老师批改作业的机会。

条件锁

条件锁使用场景是当某个对象明明已经获取了某个锁,但是因为其他条件没满足,要继续等待直到该条件满足,这个时候就要用到条件锁。这种情况下,对象会在这个条件上发生阻塞,当其他对象发现这个条件满足了的时候,就可以唤醒这个对象,让它去使用资源了。

这个例子就好像学生A和学生B共同出资买了一个游戏机,他们约定开机密码A记住前三位,B记住后三位,只有双方都在的时候才能玩。晚上,A把游戏机(资源)拿回家,明明已经资源在手,但是由于其他条件不满足(A不知道后面三位密码),所以一定要等到B也在的第二天,A才能玩上游戏机。

读写锁

读写锁并不是一把锁,而是两把,分别是读锁,写锁。

只有一个对象可以有写锁,但是可以多个对象有读锁。

当一个对象要修改一个资源数据的时候,就会要对资源上一把写锁,这时候,任何人都不能来拿锁,包括写锁和读锁。

当一个对象要一个资源数据的时候,它就要对资源上一把读锁,这个时候,其他人也可以来一起上读锁,但是不可以上写锁。

举个例子,假设网络小说作家在线写作。

当他开始写作的时候,其他人都看不到他正在写的文章,等他释放了写锁,即把文章发出去之后,大家都可以来看了(多人拿到读锁),但是这个时候,只要还有任何一个读者在看他发布的小说,他就不能对这篇小说做修改(读锁未释放,写锁不能上)。

自旋锁

这是一个特殊的互斥锁,当数据被加了锁之后,其他来想要拿锁的其他对象不会被陷入休眠阻塞态,而是会轮询资源状态,直到资源刚好被释放。这样做的好处是能够减少唤醒对象的消耗, 但是相对来说,却会消耗CPU的资源。继续用上面老师批改作业的例子,就是完成了作业小朋友不用在座位上等老师叫了,而是过一会儿就去问老师,“老师你批改完了吗”,这样做的好处当然就是一旦老师批改完了当前学生的作业,就会立刻开始批改下一个来问的学生作业,但是坏处自然就是容易把老师给问烦了,说不定批评你(消耗CPU资源)。

以上是我的浅见,欢迎各位在下方评论区点赞留言。

我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎各位关注我,与我共同进步。

留言与评论(共有 0 条评论)
   
验证码:
Top