什么是Prevayler的同步策略?

时间:2009-01-17 23:27:37

标签: java concurrency synchronization persistence prevayler

Prevayler保证所有写入(通过其事务)都是同步的。但读取怎么样?

如果没有使用显式同步(在用户代码中),是否可以进行脏读?

如果业务对象被读为:

,它们是否可行
// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);

如果是这样,哪种同步策略对用户代码有利?

(考虑业务对象A包含业务对象Bs的集合),

    例如,
  • 使用同步集合(A中的Bs) 来自java.util.concurrent包?
  • 同步集合读取外部事务与 集合在事务内部写入,例如使用 “同步(集合)”代码围绕读写?

2 个答案:

答案 0 :(得分:4)

推荐的方法是使用JMatch Query和Prevayler.execute(Query)。直接或使用子类化。

返回的结果必须是原始值或不可变对象。如果您计划返回可变对象,则应将JMatch Query子类化以执行这些深层副本。通过这种方式,您可以获得一个系统,可以使用其他(合理的)读写操作锁定每个敏感读取。这可以加速和简化开发,特别是对于没有多线程编程实现的开发人员。

如果你需要在高并发负载下获得更高的性能,这应该是一种罕见的情况,你确实可以使用上面描述的细粒度锁定 - 使用“synchronized”和java.util.concurrent。

有关详细信息,请参阅this discussion

答案 1 :(得分:1)

我看了Prevayler已经很长时间了(我在大约6或7年前在POC项目中使用过它)。我很确定如果通过Prevayler进行所有读写操作都不需要进一步同步 - 当然我不需要做我所做的事情,并且有多个线程使用数据存储区。