2012-11-18 50 views
0

我試圖實現斷路器模式作爲一種學習經驗(我知道這種模式已經在多個框架中實現)。螺紋安全斷路器

我的幼稚,簡化,不是線程安全的實現看起來像

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%線程安全的開源框架。但是,嘗試實現這一點也許沒有意義。

這個問題更多的是關於線程安全而不是斷路器。

+1

只是爲了澄清:我知道爲什麼這不是線程安全的。但我不知道的是如何使它安全。 – tbruhn

+0

我不是很理解這個問題,或者我錯在閱讀,你是說你永遠不想要超過10個電話在任何時候活動?否則,如果在系統發生故障之前有100個呼叫通過了斷路器,那麼您將有100個活動呼叫仍在斷路器保護的代碼的「內部」,而您最多隻需要10個。 –

+0

可以說遠程系統是一切正常。但在某些時候,所有到遠程系統的呼叫超時。我想要的是將那些得到例如TimedOutException的調用限制爲不超過10次。 – tbruhn

回答

0

如果我理解正確,isOpen方法訪問共享變量,推測是boolean。所有你需要的是使布爾volatile。這將確保健康檢查線程的任何寫入對於所有資源獲取線程都立即可見。

+0

你已經正確理解了!然而,我正在做的東西,如果(條件)做​​一些事情=>競賽條件 – tbruhn

+0

我沒有看到那裏的比賽條件。你將不得不提供更多的細節,以使其變得明顯。請注意,在「做某事」時,不需要保持這種狀態。 –