互斥锁,共享锁,自旋锁 等

来源:互联网 发布:java居中输出金字塔 编辑:程序博客网 时间:2024/05/08 12:54


互斥锁(排它锁、独占锁、写锁、X锁)和共享锁(读锁、S锁) 自旋锁              


共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的锁,直到在事务的末尾将资源上的锁释放为止。获准排他锁的事务既能读数据,又能修改数据。

mysql 锁机制参考 http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html

linux 自旋锁:

自旋锁参考 http://blog.csdn.net/gongmin856/article/details/8273524

当进程进入CPU运行时,就会给它的代码上锁,以免别的CPU中的进程修改里面的代码(不排除CPU给别的CPU上锁这样的情况,以后会讨论到。)。

所谓自旋锁就是这样的一把锁:进程A进入CPU,锁上门运行,进程B来到CPU前,发现门被锁上了,于是等待进程A出来交出开锁钥匙。


正如每次我们谈到“锁”这个概念时,总会谈到“死锁”——是的,我们用锁,就必须防止死锁

死锁是这样产生的:进程A进入CPU运行,上锁,进程B 来到CPU门前等待进程A出来,可是糟糕的情况出现了:进程A要想出来就必须获取进程B的帮助,于是进程A开始等待进程B的帮助,可是进程B却又一直等待进程A出来!这样的等待无法终止,最终成为死锁。

再比如,进程A要锁上甲代码段,然后想再去锁乙代码段,进程B要锁上乙代码段,然后想再去锁甲代码段。第一步大家都没问题,可是两个进程都要进行下一步时,发现无法完成任务了:进程A已经锁上甲代码段,进程B没法再去操作它,同理进程B已经锁上乙代码段,进程A也没办法操作它,于是两个进程等待对方释放锁,当然,这样的等待也是无止无休的。这就好象两辆汽车在一座很榨的桥上相向行驶,两车碰头谁也不让谁,都在等待对方让路。

避免死锁,必须使每次上锁操作都是有顺序的、原子的操作。有顺序的,也就是说每次都按照可执行队列地址从低向高的顺序上锁——我们以后会很好的讨论这个。

原子的,就是说每次上锁必须执行到底,否则不予执行

0 1