我正在阅读Fowlers PoEAA并尝试了解如何在多线程环境中正确使用所描述的模式“工作单元”和“身份地图”。 Fowler声称“工作单元”必须是线程的本地,他建议对“身份图”执行相同的操作。但是,我不明白我如何能够在多线程环境中使用这些模式。
假设线程A从数据库加载一个巨大的对象树。因此,对象存储在A的“身份地图”中,并在A的“工作单位”中注册。我现在想在树上执行一些可以在多个线程中拆分的更新操作。但是,如果线程B修改了由AI加载的对象,则需要在A的“工作单元”中将其“脏”注册,或者我需要在B中创建一个新的“工作单元”并将其注册为脏。
我在“身份地图”中看到了类似的问题。如果线程A加载一个对象然后在线程B中处理并且B需要加载一个依赖对象,这会混淆概念,因为现在A的“身份图”中的对象指向B的“身份图”中的另一个对象。如果对A存储的对象进行了更改并且对B存储的对象进行了更改,则需要同时提交它们。
我需要的是多线程环境中两种模式的好处,在这种环境中,我可以对一些线程中加载的某些对象执行工作,但是这些对象的工作应该在不同的其他线程之间进行划分。 此外,应该可以在不同的线程中划分对象的巨大树结构的不同子树的加载。
理想情况下,我的库的用户可以选择是否要对在一个线程中完成的对象进行更改,使其对另一个线程透明,或者希望两个线程都在对象的独立副本上工作。那就是在线程之间共享会话。
现在我不知道如何通过这两种模式实现这一目标。有人能给出一点线索或者指出一个可以实现的工作实现,看看如何做到这一点?
顺便说一句,我在C ++环境中工作。