Ser*_*gey 5 java concurrency persistence synchronization prevayler
Prevayler保证所有写入(通过其事务)都是同步的.但读取怎么样?
如果没有使用显式同步(在用户代码中),可以进行脏读操作吗?
如果业务对象被读为以下内容,它们是否可行:
// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,什么同步策略对用户代码有利?
(考虑业务对象A包含业务对象B的集合),
推荐的方法是使用 JMatch Query 和 Prevayler.execute(Query)。直接或通过使用子类化。
返回的结果必须是原始值或不可变对象。如果您计划返回可变对象,您应该子类化 JMatch Query 来执行这些深层复制。通过这种方式,您将获得一个将每个合理读取与其他(合理)读取和写入锁定的系统。这可以加速并简化开发,特别是对于没有多线程编程经验的开发人员。
如果您在高并发负载下需要更高的性能(这应该是一种罕见的情况),您确实可以使用上面描述的细粒度锁定 - 使用“synchronized”和 java.util.concurrent。
有关更多详细信息,请参阅此讨论。