我必须在不同的系统上调用操作。另一个系统是高并发、分布式的。因此我通过 MessageBus 集成它。需要一种实现来让调用者等待,直到在总线上收到结果或超时到期。实现包括三个步骤:首先,我必须将 future 和 CountDownLatch(一旦收到结果就释放)打包到 ConcurrentHashMap 中。该映射与侦听 MessageBus 的组件共享。然后我必须开始执行并最后等待闩锁。
public FailSafeFuture execute(Execution execution,long timeout,TimeUnit timeoutUnit) {
//Step 1
final WaitingFailSafeFuture future = new WaitingFailSafeFuture();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final PendingExecution pendingExecution = new PendingExecution(future, countDownLatch);
final String id = execution.getId();
pendingExecutions.put(id, pendingExecution); //ConcurrentHashMap shared with Bus
//Step 2
execution.execute();
//Step 3
final boolean awaitSuccessfull = countDownLatch.await(timeout, timeoutUnit);
//...
return future;
}
所以问题是:编译器可以对这 3 个步骤重新排序吗?据我了解,只有步骤1和步骤3形成了发生之前的关系。因此理论上,第 2 步可以由编译器自由移动。是否可以将步骤 2 移到等待后面,从而使代码无效?
后续问题:用共享对象上的等待/通知组合替换 CountDownLatch 是否可以解决问题而无需进一步同步(当然不考虑超时)
一只名叫tom的猫
相关分类