[英]Lock on object's field value
我的微服务正在接收来自RabbitMQ的消息并将其存储在CouchDB上,我正在创建多个使用者线程来处理它们,并且由于发生了竞争情况,因此我的代码抛出ConflictUpdateException,即
线程X,Y同时读取同一对象的bed db值; 线程X在线程Y之前更新Couch中的记录,但是线程Y在X修改的记录之前基于哈希值(_rev)更新记录。
对象的唯一标识符是复合的:name + age + id,
如何仅对具有相同(name + age + id)的线程执行关键部分?
我不想实施的可能方法:
锁定字符串值(名称+年龄+ ID)。 [不是一个好习惯]
HashMap的String和CustomObjects用于锁定。 [因为我没有对唯一对象计数的限制]
有什么建议么?
我认为您应该跟踪_rev:
您将需要并发HashMap结构,其中包含锁定的主键。 它们的表示取决于您,不鼓励使用的字符串将与某些实现hashcode + equals的特殊类的实例一样好。 您的使用者将通过调用原子putIfAbsent()遍历试图锁定记录的输入队列。 如果成功,它将执行其storeToDatabase()调用,然后从该映射中移除()条目。 否则,移至队列中的下一个条目。
这样,您在此锁定键映射中只需要几个(使用者数量)条目,就不会占用大量内存,并且并行性级别会很高。 但是,它不会保留传入的订单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.