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

根据维基百科:

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

你能解释一下术语“共享”和“排他”背后的原因吗?

106240 次浏览

很简单。读锁也称为共享锁,因为可以同时读取多个进程。读锁的作用是防止另一个进程获取写锁。相比之下,当写操作完成时,写锁会抑制所有其他操作,这就是为什么它被描述为独占的原因。

因此,读锁表示“现在可以读取,但如果想写入,则必须等待”,而写锁表示“必须等待”。


我知道你在研究支持你的学业,但我忍不住要讲课。

锁定使用不当是性能问题的主要原因。使用区分读写锁的锁定系统是一个很好的开始,但是仔细的设计有时可以消除很多需要锁定的地方。例如,对于每个 state 元素,会话状态应该在一个全局集合中保存 永远不会

我亲眼见过。这是一种糟糕的设计,对于会话状态的每一个最后更改,都会导致装箱和对集合的更改,从而导致持久的写锁。开销是严重的,有效地减少了服务器的单线程行为。

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

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

  • 独占锁或写锁为写入文件的指定部分提供了进程独占访问权限。当写锁就位时,其他进程无法锁定文件的该部分。

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

更多信息: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

我把这个答案写下来是因为我认为这是一个有趣(而且合适)的类比:

可以把可锁对象想象成包含 老师(作者)和许多 学生(读者)的教室中的 黑板(可锁)。

当老师在黑板上写东西时(专用锁) :

  1. 没有人能够读到它,因为它仍然在写,而且她阻止了你的视图 = > 如果对象是独占锁定的,则无法获得共享锁定

  2. 其他老师也不会过来开始写作,或者黑板变得难以阅读,使学生感到困惑 = > 如果对象是独占锁定的,则无法获得其他独占锁定

当学生们在阅读(共享锁)黑板上的内容时:

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

  2. 老师等他们读完后,才清空黑板,写出更多 = > 如果已经存在一个或多个共享锁,则无法获得独占锁

数据库方面的原则也是一样的

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

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

  • 独占锁 不允许读写操作。

  • 共享锁 只允许读操作。