【发布时间】:2020-04-26 19:14:07
【问题描述】:
我有一个服务方法,它基本上是将记录插入数据库。我想要实现的是基于对象或其变量阻止一段代码。
我需要根据这个 id 阻塞其他线程:rcvTransactionRequest.getPoDistributionId()
我不想阻止所有进入此方法的线程。最后,我正在尝试验证如果多个线程进入关键部分可能会发生的不应超过的应收数量。
PoDistPayload poDistPayload = poDistService.getPoDist(rcvTransactionRequest.getPoDistributionId());
synchronized (poDistPayload) {
if (!poDistService.isReceivable(poDistPayload, rcvTransactionRequest.getQuantity()))
throw ebsExceptionFactory.build(1036L, rcvTransactionRequest.getQuantity(), poDistPayload.getReceivableQuantity());
PoDistRcv poDistRcv = PoDistRcv.of(rcvTransactionRequest);
poDistRcv.setStatus(Status.TRANSACTION_STARTED);
poDistRcv = poDistRcvRepository.save(poDistRcv);
return new BaseTransactionResponse(poDistRcv.getTransactionId(), serialCountPerRequest, poDistRcv.getStatus());
}
【问题讨论】:
-
您是否希望根据
distributionId的值只允许一个线程进入临界区。不是对象实例? -
基本上是的,但我认为这无关紧要,因为该对象还有用于 equals 和 hashcode 的 distributionId 字段。
标签: java multithreading synchronized