gpt4 book ai didi

design-patterns - "Journaling"还是 "transactions"设计模式?

转载 作者:行者123 更新时间:2023-12-04 07:04:38 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我正在寻找实现一个被记录的对象,或者其中有一个持久事务。也就是说,对象包含数据(可能是 Map)。当对数据进行更改时,这些更改将单独保存,如果您愿意,可以将其放入沙盒中,以便任何外部对象都可以引用基本状态(更改之前)或可以访问最新数据。然后还有另一个操作将更改提交到基本状态。

它让我想起了 Linux 日志文件系统。文件系统更改被写入日志,然后才提交到永久存储中。

它也可能更类似于关系数据库世界中“事务”的概念;也就是说,你有一些数据,你开始一个事务并以某种方式操作数据。并发进程将看到没有任何更改的旧数据。然后您可以“回滚”事务,或“提交”您的更改。

我特别希望在 Java 中实现这一点,但显然它是一种通用的面向对象模式,如果它存在的话。我希望至少可以创建它,但我不太确定实现它的最佳方法。

此外,假设对象包含大量数据、整个层次结构(子对象等)。所以不能只保留整个数据树的两个副本;这将非常浪费内存,并且复制操作(提交时)将花费太长时间。我希望在游戏的上下文中实现这一点,每帧一个提交操作,所以它确实需要是最佳的。

最佳答案

实现您想要的最佳方式是使对象及其所有子对象不可变。那么这两个线程就可以在没有任何冲突的情况下对它们进行操作,并且您不必维护所有内容的两个副本。唯一需要两个副本的是实际更改的内容,而且这些内容可能非常小。

假设对象 A 由对象 B 和 C 组成。对象 B 由对象 D 和 E 组成。对象 C 由对象 F 和 G 组成。所以 A、B 和 C 都只是两个指针,而 D、E、 F 和 G 是任意的。

首先,您创建初始实例并将其提供给两个线程。

ThreadOne -> A1{ B1{ D1, E1 } C1{ F1, G1 } } 
ThreadTwo -> A1{ B1{ D1, E1 } C1{ F1, G1 } }

所以两个线程都指向同一个实例,没有消耗额外的内存,也没有线程问题,因为对象永远不会改变。

现在 ThreadOne 需要修改对象 F。为此,它只需创建一个新的 F,一个新的 C 来包含它,以及一个新的 A 来包含新的 C。原来的 B、D、E 和 G 不变,并且不需要复制。
ThreadOne -> A2{ B1{ D1, E1 } C2{ F2, G1 } } 
ThreadTwo -> A1{ B1{ D1, E1 } C1{ F1, G1 } }

这两个线程共享 B、D、E 和 G 的实例。

现在 ThreadOne 需要修改对象 E。
ThreadOne -> A3{ B2{ D1, E2 } C2{ F2, G1 } } 
ThreadTwo -> A1{ B1{ D1, E1 } C1{ F1, G1 } }

现在 ThreadTwo 需要最新版本,所以 ThreadOne 只是给它一个指向其副本的指针。
ThreadOne -> A3{ B2{ D1, E2 } C2{ F2, G1 } } 
ThreadTwo -> A3{ B2{ D1, E2 } C2{ F2, G1 } }

由于对象是不可变的,因此不存在任何线程问题的危险,并且 ThreadOne 可以继续进行更改,每次创建一个仅包含已更改部分及其容器的新实例。
ThreadOne -> A4{ B3{ D2, E2 } C2{ F2, G1 } } 
ThreadTwo -> A3{ B2{ D1, E2 } C2{ F2, G1 } }

ThreadOne -> A5{ B3{ D2, E2 } C3{ F3, G1 } }
ThreadTwo -> A3{ B2{ D1, E2 } C2{ F2, G1 } }

这是快速、高效的内存和线程安全的。

关于design-patterns - "Journaling"还是 "transactions"设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3359624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com