问题:我们有永远不会阻止的关键路径代码。在许多地方,它依赖于配置数据或来自外部源的类似的,不经常更新的数据。
当我们需要重新加载配置数据或从外部源刷新数据时,我们不希望锁定对该数据的访问并可能阻止关键路径线程。
解决方案:将有问题的数据移动到自己的类中。使用后台线程完全执行重新加载并验证数据。然后,当它准备就绪时,用新的数据引用覆盖旧的数据引用。
此引用必须是volatile,以确保所有线程的可见性。
只要关键路径代码始终不具备最新数据的必要性,这就非常有效,绝对性能影响最小(所有数据都通过易失性参考)。< / p>
真正的问题是,是否有这个并发设计模式的名称?
有问题的语言是Java,但我认为这适用于支持共享内存并发编程风格的大多数语言。
答案 0 :(得分:4)
对我来说,它看起来像是对象的原子引用
Value Object是一个持久对象。它只表示一个值,即它表示从调用构造函数到其生命结束时的值(无状态更改)。作为一个价值对象,它自动是线程安全的。
对它的原子引用只是访问最后一个版本的Value Object的中心点。
Clojure语言称之为“ref”。
我发现了一篇关于GoF形式的设计模式的博客文章,看起来像你想要的: http://tobega.blogspot.com/2008/03/java-thread-safe-state-design-pattern.html
修改强>
来源:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey
答案 1 :(得分:2)
double buffering可以成为您要找的词吗?
答案 2 :(得分:0)
您仍然可以执行高性能锁定。这听起来很危险。无论如何,你需要获取数据的副本 - 在锁定时 - 解锁它,然后处理这些数据。
答案 3 :(得分:0)
我将得出结论此模式没有众所周知的名称。
clojure中的概念干净地映射到我在此描述的内容,但 Ref 和 Identity 对Java中的设计模式名称描述不够。感谢@Thiago指出这些。
还要感谢@Ed指出双缓冲图形和硬件是一个非常相似的概念,但它再次不能用作Java中的设计模式名称。
出于我的目的,我将与同事一起使用 Atomic Build和Swap 这样的内容,以便我们能够处理这种经常出现的设计。