信號隔離
TryableSemaphore 接口定義了信號隔離的行爲,內部藉助AtomicInteger類實現資源的分配。HystrixProperty<Integer> numberOfPermits 存儲可分配的資源,AtomicInteger count存儲已分配的資源。numberOfPermits
在類初始化時就需要賦值,所以定義成了final類型。
protected final HystrixProperty<Integer> numberOfPermits;
private final AtomicInteger count = new AtomicInteger(0);
申請資源
tryAcquire()負責資源的分配。有資源申請請求時,對count執行incrementAndGet()操作,如果返回值大於numberOfPermits的值,則進行decrementAndGet進行回退剛纔的加一操作,並返回false,表示申請資源失敗;如果返回值不大於numberOfPermits的值,則表示申請資源成功,返回true。詳見代碼:
@Override
public boolean tryAcquire() {
int currentCount = count.incrementAndGet();
if (currentCount > numberOfPermits.get()) {
count.decrementAndGet();
return false;
} else {
return true;
}
public boolean tryAcquire() {
int currentCount = count.incrementAndGet();
if (currentCount > numberOfPermits.get()) {
count.decrementAndGet();
return false;
} else {
return true;
}
}
釋放資源
邏輯執行完成後,要進行資源的釋放,以便讓其他線程獲得資源。release()負責資源的釋放。有資源釋放請求時,對count進行decrementAndGet()操作。
同一個業務不同的資源依賴時,可以選擇信號量隔離,降低線程調度帶來的性能消耗。
到此,信號量資源的申請和釋放講完了。