失敗的原子調用應該使得對象保持在被調用以前的狀態,所謂:失敗原子性api
- 幾種途徑實現:
- 設計一個不可變對象,其失敗原子性是顯然的
- 對於可變參數,執行前檢查參數有效性
- 避免執行一半報錯,後續沒法執行致使狀態不一致
- 調整計算順序,使得任何可能失敗的部分,放到狀態修改前,進而得到原子性
- (不經常使用)編寫恢復代碼,攔截操做中的失敗,使對象回滾到原來的狀態
- 在對象的臨時拷貝上作操做,成功後再用臨時拷貝的結果代替對象的內容
- 若是失敗,不影響原有對象的狀態
- 因爲是臨時數據,計算過程更加迅速
- Collections.sort 先將輸入列表轉到數組中,下降排序內循環訪問元素的開銷
- 如上代碼,若是不作檢查size == 0 ,仍然會拋出異常,
- 可是size 域處於,下標爲-1的不一致狀態,其餘操做都沒法進行
- 別的方法使用時,會拋出與之不匹配的異常
並不是都能作到失敗原子性:數組
- 好比倆線程同時操做一個對象,就可能會致使不一致狀態:ConcurrentModificationException
- 錯誤(相對於異常)一般是不可恢復的,不必保持失敗一致性
通常,方法規範的一部分,任何異常都應該使得對象保持在方法調用以前的狀態數據結構
- 若是違反該規範,對象將會處於什麼狀態
- 大部分api 沒有作到這一點