language-agnostic - 摆脱低级锁定的技术

标签 language-agnostic design-patterns locking

我想知道并且需要可用于减少低级锁定的策略。 然而这里的问题是,这不是服务器应用程序的新代码(有数万行 C++ 代码),所以我不能重写整个代码。

我担心这个问题现在可能还没有解决方案(为时已晚)。不过,我想听听其他人使用过的好的模式。

现在有太多的锁,没有那么多的冲突,所以这是一个由偏执狂引起的硬件性能问题。 描述代码的最佳方式是单线程代码突然变得充满了锁。

最佳答案

为什么需要消除低级锁定?你有死锁问题吗?你有性能问题吗?还是缩放问题?锁通常是竞争的还是非竞争的?

您使用的是什么环境?例如,C++ 中的答案将不同于 Java 中的答案。例如。 Java 6 中无竞争的同步块(synchronized block)实际上在性能方面相对便宜,因此只需升级您的 JRE 就可以解决您试图解决的任何问题。通过切换到不同的编译器或锁定库,C++ 中可能会有类似的性能提升。

一般来说,有几种策略可以让您减少获得的互斥体数量。

首先,任何只能从单个线程访问的东西都不需要互斥量。

其次,任何不可变的东西都是安全的,只要它是“安全发布”的(即以这样一种方式创建,即部分构造的对象对另一个线程永远不可见)。

第三,大多数平台现在都支持原子写入——当只需要保护一个原始类型(包括指针)时,这会有所帮助。这些工作方式与数据库中的乐观锁定非常相似。您还可以使用原子写入来创建无锁算法来替换更复杂的类型,包括 Map 实现。然而,除非你非常非常好,否则你最好借用别人的调试实现(java.util.concurrent 包包含很多很好的例子)——众所周知,在编写自己的算法时很容易意外引入错误。

第四,扩大互斥锁的范围会有所帮助——要么简单地保持一个互斥锁打开更长时间,而不是不断地锁定和解锁它,要么锁定一个“更大”的项目——对象而不是它的属性之一, 例如。但是,这必须非常小心地完成;您可以通过这种方式轻松引入问题。

关于language-agnostic - 摆脱低级锁定的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/125743/

相关文章:

java - 如果我从 synchronized block 返回,什么时候释放锁?

c# - 函数用例

java - 防止 TCP 套接字连接重试

design-patterns - 为什么代理模式需要继承?

delphi - 何时调用 TInterfacedObject.Destroy(ScopedLock 类)

python - 如何防止覆盖别人修改过的对象

根据浏览量/评论计算页面重要性的算法

algorithm - 将 N 个不同半径的圆放在一个较大的圆内而不重叠

c# - S.O.L.I.D Essentials 缺少点?

java - 类设计——避免冗余代码