我正在尝试将断路器模式作为一种学习体验(我知道这种模式已在多个框架中实现)。
我天真,简化且不是线程安全的实现看起来像
CircuitBreaker circuitBreaker = null;
try {
//get the current circuit breaker
if (circuitBreaker.isOpen()) {
throw new CircuitBreakerOpenException();
} else {
//proceed normally
//or retry if half open
}
} catch (CircuitBreakerCallbackExecutionException e) {
//update or replace the circuit breaker
}
如何在没有同步保护呼叫(断路器对象)的情况下实现线程安全实现?理想情况下,如果设置了故障阈值10,如果远程系统出现故障,我不希望允许超过10个多线程呼叫通过保护。
到目前为止,我还没有找到任何看起来100%线程安全的开源框架。但也许没有必要试图实现这一目标。
这个问题更多的是关于螺纹安全而不是关于断路器。
答案 0 :(得分:0)
如果我理解正确,isOpen
方法会访问共享变量,大概是boolean
。您所需要的只是制作布尔值volatile
。这将确保健康检查线程对它的任何写入都立即对所有资源获取线程可见。