努力使失敗保持原子性(64)

失敗的原子調用應該使得對象保持在被調用以前的狀態,所謂:失敗原子性api

  • 幾種途徑實現:
    • 設計一個不可變對象,其失敗原子性是顯然的
    • 對於可變參數,執行前檢查參數有效性
      • 避免執行一半報錯,後續沒法執行致使狀態不一致
      • 調整計算順序,使得任何可能失敗的部分,放到狀態修改前,進而得到原子性
    • (不經常使用)編寫恢復代碼,攔截操做中的失敗,使對象回滾到原來的狀態
      • 主要用於永久性的數據結構
    • 在對象的臨時拷貝上作操做,成功後再用臨時拷貝的結果代替對象的內容
      • 若是失敗,不影響原有對象的狀態
      • 因爲是臨時數據,計算過程更加迅速
        • Collections.sort 先將輸入列表轉到數組中,下降排序內循環訪問元素的開銷

  • 如上代碼,若是不作檢查size == 0 ,仍然會拋出異常,
  • 可是size 域處於,下標爲-1的不一致狀態,其餘操做都沒法進行
  • 別的方法使用時,會拋出與之不匹配的異常

並不是都能作到失敗原子性:數組

  • 好比倆線程同時操做一個對象,就可能會致使不一致狀態:ConcurrentModificationException
  • 錯誤(相對於異常)一般是不可恢復的,不必保持失敗一致性

通常,方法規範的一部分,任何異常都應該使得對象保持在方法調用以前的狀態數據結構

  • 若是違反該規範,對象將會處於什麼狀態
  • 大部分api 沒有作到這一點
相關文章
相關標籤/搜索