独占锁和共享锁之间有什么区别?

时间:2012-08-06 23:39:13

标签: unix locking

根据维基百科,

  

共享锁有时称为“读锁”,而排它锁有时称为“写锁”。

你能解释“共享”和“独家”这些术语背后的原因吗?

4 个答案:

答案 0 :(得分:330)

我写下这个答案是因为我认为这将是一个有趣(和适合)的类比:

将可锁定对象视为包含教师(作家)和许多学生(读者)的教室中的黑板(可锁定) )。

当老师正在写一些东西(独家锁定)时:

  1. 没有人可以阅读,因为它仍然在写,而且她正在阻止你的观点=> 如果对象被排他锁定,则无法获得共享锁

  2. 其他教师也不会出现并开始写作,或者董事会变得难以理解,并使学生感到困惑=> 如果对象被排他锁定,则无法获得其他排他锁

  3. 当学生正在阅读(共享锁)时,董事会上的内容是什么:

    1. 他们都可以阅读上面的内容,一起=> 多个共享锁可以共存

    2. 老师等她完成阅读,然后才清除董事会写更多=> 如果已存在一个或多个共享锁,则无法获取排他锁

答案 1 :(得分:25)

这很简单。读锁也称为共享锁,因为多个进程可以同时读取。读锁定的目的是防止另一个进程获取写锁定。相反,写入锁定会在写入操作完成时禁止所有其他操作,这就是为什么它被描述为独占。

所以读取锁定说“你现在可以阅读,但如果你想写,你必须等待”,而写锁则说“你必须等待”。


我意识到你正在研究支持你的学习,但我无法抗拒讲课的冲动。

无法使用锁定是导致性能问题的主要原因。使用区分读写锁定的锁定系统是一个良好的开端,但仔细的设计有时可以消除锁定的大部分需求。例如,会话状态应该从不在每个状态元素的一个全局集合中保存。

我实际上已经看到了这一点。这是一个残酷的设计,导致拳击和对会话状态的每次最后更改的集合的更改,需要一个持久的写锁定。开销正在瘫痪,有效地将服务器减少到单线程行为。

简单地将所有会话状态聚合到一个结构中是一个巨大的进步。对会话状态的更改只是更改了会话状态结构的成员值。由于没有其他会话有机会或甚至有机会直接引用会话的状态,因此唯一更新的集合是会话列表。因此,在会话期间完全没有锁定,仅在开始和结束时,吞吐量上升了3000倍。

另一种常见的锁定方案是在用户应用程序的线程之间共享的资源。大多数现代框架使用消息而不是锁来解决这个问题。当你“转换到UI线程”时,你实际上是在排队一个包含函数指针和一些参数的消息(或者一个委托和一个堆栈帧,具体取决于实现)。

答案 2 :(得分:4)

  • 独占或写锁定为进程提供了写入文件指定部分的独占访问权限。在写入锁定的同时,没有其他进程可以锁定文件的该部分。

  • 共享或读取锁定禁止任何其他进程请求对文件的指定部分进行写锁定。但是,其他进程可以请求读锁定。

更多相关内容:http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

答案 3 :(得分:2)

数据库方面的原理相同。根据Oracle文档

独占锁定模式可防止共享相关资源。获得此锁定模式以修改数据。第一个独占锁定资源的事务是唯一可以在释放独占锁之前更改资源的事务。

共享锁定模式允许共享相关资源,具体取决于所涉及的操作。读取数据的多个用户可以共享数据,持有共享锁以防止编写者(需要独占锁定)进行并发访问。几笔交易可以 获取同一资源上的共享锁。