这个并发模式有名称吗?

时间:2011-09-29 15:40:04

标签: java concurrency volatile

问题:我们有永远不会阻止的关键路径代码。在许多地方,它依赖于配置数据或来自外部源的类似的,不经常更新的数据。

当我们需要重新加载配置数据或从外部源刷新数据时,我们不希望锁定对该数据的访问并可能阻止关键路径线程。

解决方案:将有问题的数据移动到自己的类中。使用后台线程完全执行重新加载并验证数据。然后,当它准备就绪时,用新的数据引用覆盖旧的数据引用。

此引用必须是volatile,以确保所有线程的可见性。

只要关键路径代码始终不具备最新数据的必要性,这就非常有效,绝对性能影响最小(所有数据都通过易失性参考)。< / p>

真正的问题是,是否有这个并发设计模式的名称

有问题的语言是Java,但我认为这适用于支持共享内存并发编程风格的大多数语言。

4 个答案:

答案 0 :(得分:4)

对我来说,它看起来像是对象的原子引用

Value Object是一个持久对象。它只表示一个值,即它表示从调用构造函数到其生命结束时的值(无状态更改)。作为一个价值对象,它自动是线程安全的。

对它的原子引用只是访问最后一个版本的Value Object的中心点。

Clojure语言称之为“ref”。

我发现了一篇关于GoF形式的设计模式的博客文章,看起来像你想要的: http://tobega.blogspot.com/2008/03/java-thread-safe-state-design-pattern.html

修改

Rich Hickey(Clojure的创建者)将其定义为身份:“一个推定的实体,我们将其与一系列因果相关的值(状态)联系起来”。

来源: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 这样的内容,以便我们能够处理这种经常出现的设计。