fail-fast機制
快速失敗模塊的職責是檢測錯誤,然后讓系統的下一個最高級別處理錯誤,一旦發生例外, 直接停止并上報,盡最大努力去拋出例外,
這樣做的好處是可以預先識別出一些錯誤情況,但是它同樣也可能會為我們帶來一些問題,
集合類的fail-fast機制
當多個執行緒對部分集合進行結構上的改變操作,有可能會產生fail-fast機制,這時候會拋出ConcurrentModificationException
使用增強for回圈嘗試洗掉集合中的元素會報這個例外
我們對class進行反編譯,可以發現foreach其實是依賴了while回圈和Iterator實作的
真正報錯的原因是checkForComodification方法
它會檢查modCount和expectedModCount的值是否相等,
modCount是ArrayList中的一個成員變數,它表示集合實際被修改的次數
expectedModCount是ArrayList的一個內部類Itr的成員變數 HashMap HashMapSpliterator的成員變數
然后使用remove方法 只會對modCount進行修改,所以在下一次next的時候就會報錯
fail-fast 的主要目的就是識別并發,然后通過例外的方式通知用戶
fail-safe機制
java.util.concurrent 包下的容器都是 fail-safe 的,可以在多執行緒下并發使用,并發 修改,同時也可以在 foreach 中進行 add/remove ,
fail-safe 集合的所有對集合的修改都是先拷貝一份副本,然后在副本集合上進行的, 并不是直接對原集合進行修改,并且這些修改方法,如 add/remove 都是通過加鎖來控制并發的,
迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的,
Copy-On-Write 簡稱 COW,是一種用于程式設計中的優化策略,其基本思路是, 從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容 Copy 出去形成一個新的內容然后再改,這是一種延時懶惰策略,
CopyOnWrite 容器即寫時復制的容器,通俗的理解是當我們往一個容器添加元素的時 候,不直接往當前容器添加,而是先將當前容器進行 Copy,復制出一個新的容器,然后新 的容器里添加元素,添加完元素之后,再將原容器的參考指向新的容器,
它的add/remove方法是需要加鎖的,為了避免copy出n個副本出來,導致并發寫
但是它的讀方法是沒有加鎖的,這樣做的好處是我們可以對 CopyOnWrite 容器進行并發的讀,當然,這里讀到的資料可能不是最新的,因為寫時復制的思想是通過延時更新的策略來實作資料的最終一致性的,并非強一致性,
CopyOnWrite 并發容器用于讀多寫少的并發場景,比如白名單,黑名單,商品類目的 訪問和更新場景,
本次文章的內容就到這里~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281422.html
標籤:其他
