【发布时间】:2018-12-16 21:29:53
【问题描述】:
如何根据方法参数值提供同步?
所有使用“相同”参数值 A 的方法调用都应该同步。具有不同参数值的方法调用,例如B 可以访问,即使与 A 的呼叫已经在等待。对 B 的下一个并发调用也必须等待第一个 B 被释放。
我的用例:我想在 ID 级别同步 对 JPA 实体的访问,但想避免悲观锁定,因为我需要某种队列。用于锁定的 'key' 是 entity ID - 实际上是 Java Long 类型。
protected void entityLockedAccess(SomeEntity myEntity) {
//getId() returns different Long objects so the lock does not work
synchronized (myEntity.getId()) {
//the critical section ...
}
}
我阅读了有关锁定对象的信息,但我不确定它们如何适合我的情况。 在顶层,我想管理对执行关键代码的应用程序的特定 REST 调用。
谢谢, 克里斯
【问题讨论】:
-
为什么需要同步访问。 “我需要一个队列”并不能真正解释它。除非您有充分的理由,否则我建议您不要以您自己复杂的方式重新实现实体锁定。
-
很有可能会遇到悲观或乐观锁定异常,因为有很多对同一实体的并发调用,每个调用都会修改实体中的集合。有关如何解决此问题的任何建议?
-
好吧,像CQRS 这样的东西可能适用于此。主要问题是为什么对相同实体有如此多的并发调用(足以使乐观锁定成为不可行的替代方案)。当您处理数据库并且对锁定不是很有经验时,您不想开始创建自己的“解决方案”。
-
是的 - 我不想为这个问题开始自己的解决方案。但是预构建的解决方案是什么?不仅实体访问应该被锁定,而且在关键代码部分中还有其他操作。
-
您正在为我怀疑是设计问题的问题寻找快速解决方案。
标签: java rest synchronization synchronized