Преглед изворни кода

GetBreaker need double-check (#112)

shenbaise9527 пре 4 година
родитељ
комит
9e9ce3bf48
1 измењених фајлова са 7 додато и 20 уклоњено
  1. 7 20
      core/breaker/breakers.go

+ 7 - 20
core/breaker/breakers.go

@@ -41,10 +41,12 @@ func GetBreaker(name string) Breaker {
 	}
 
 	lock.Lock()
-	defer lock.Unlock()
-
-	b = NewBreaker()
-	breakers[name] = b
+	b, ok = breakers[name]
+	if !ok {
+		b = NewBreaker(WithName(name))
+		breakers[name] = b
+	}
+	lock.Unlock()
 	return b
 }
 
@@ -55,20 +57,5 @@ func NoBreakFor(name string) {
 }
 
 func do(name string, execute func(b Breaker) error) error {
-	lock.RLock()
-	b, ok := breakers[name]
-	lock.RUnlock()
-	if ok {
-		return execute(b)
-	}
-
-	lock.Lock()
-	b, ok = breakers[name]
-	if !ok {
-		b = NewBreaker(WithName(name))
-		breakers[name] = b
-	}
-	lock.Unlock()
-
-	return execute(b)
+	return execute(GetBreaker(name))
 }