談談fail-fast與fail-safe是什麼以及工做機制

前面回顧: HashMapd的存取原理你知道多少java

今天,咱們來談談fail-fast與fail-safe是什麼以及工做機制
複製代碼

fail-fast是什麼?

fail-fast的字面意思是「快速失敗」。當咱們在遍歷集合元素的時候,常常會使用迭代器,但在迭代器遍歷元素的過程當中,若是集合的結構被改變的話,就會拋出異常,防止繼續遍歷。這就是所謂的快速失敗機制。微信

下面咱們來看看官方文檔在HashMap這個集合中,它是怎麼解釋fail-fast的(以下圖): 併發

意思就是說,當Iterator這個迭代器被建立後,除了迭代器自己的方法(remove)能夠改變集合的結構外,其餘的因素如若改變了集合的結構,都被拋出ConcurrentModificationException異常。spa

請在繼續看官方的描述:線程

意思就是說:迭代器的快速失敗行爲是不必定可以獲得保證的,通常來講,存在非同步的併發修改時,不可能作出任何堅定的保證的。可是快速失敗迭代器會作出最大的努力來拋出ConcurrentModificationException。所以,編寫依賴於此異常的程序的作法是不正確的。正確的作法應該是:迭代器的快速失敗行爲應該僅用於檢測程序中的bug.3d

稍微總結下:fail-fast,即快速失敗機制,它是java集合中的一種錯誤檢測機制,當多個線程(當個線程也是能夠滴),在結構上對集合進行改變時,就有可能會產生fail-fast機制。code

這裏,我解釋下什麼是結構上的改變。 例如集合上的插入和刪除就是結構上的改變,可是,若是是對集合中某個元素進行修改的話,並非結構上的改變哦。cdn

下面,咱們來演示下在單線程的環境下,fail-fast拋出異常的實例:對象

for(int i = 10; i < 100; i++){
		map.put(i, i);
	}
	List<Integer> list = new ArrayList<>();
	for(int i = 0; i < 20; i++){
		list.add(i);
	}
	Iterator<Integer> it = list.iterator();
	int temp = 0;
	while(it.hasNext()){
		if(temp == 3){
			temp++;
			list.remove(3);
		}else{
			temp++;
			System.out.println(it.next());
		}
	}
}
複製代碼

打印結果:blog

**結果分析:**由於當temp==3的時候,執行list.remove()方法,集合的結構被改變了,因此再次遍歷迭代器的時候,就會拋出異常。


fail-fast的工做原理

咱們首先先來看下源碼:

**分析:**從源碼咱們能夠發現,迭代器在執行next()等方法的時候,都會調用checkForComodification()這個方法,查看modCount==expectedModCount?若是相等則拋出異常。

expectedModcount:這個值在對象被建立的時候就被賦予了一個固定的值modCount。也就是說這個值是不變的。也就是說,若是在迭代器遍歷元素的時候,若是modCount這個值發生了改變,那麼再次遍歷時就會拋出異常。
何時modCount會發生改變呢?

此次就不帶你們看源碼了。其實當咱們對集合的元素的個數作出改變的時候,modCount的值就會被改變,若是刪除,插入。但修改則不會。


fail-fast的一些處理方法

若是咱們不但願在迭代器遍歷的時候由於併發等緣由,致使集合的結構被改變,進而可能拋出異常的話,咱們能夠在涉及到會影響到modCount值改變的地方,加上同步鎖(synchronized),或者直接使用 Collections.synchronizedList來解決。


fail-fast就先講到這裏,下面簡單講講fail-safe與fail-fast的區別

當咱們對集合結構上作出改變的時候,fail-fast機制就會拋出異常。可是,對於採用fail-safe機制來講,就不會拋出異常(你們估計看到safe兩個字就知道了)。

這是由於,當集合的結構被改變的時候,fail-safe機制會在複製原集合的一份數據出來,而後在複製的那份數據遍歷。

所以,雖然fail-safe不會拋出異常,但存在如下缺點:

  1. 複製時須要額外的空間和時間上的開銷。

  2. 不能保證遍歷的是最新內容。

若是文章有錯的地方歡迎指正。若是習慣在微信看技術文章,想要獲取更多其餘資源的同窗,能夠關注微信公衆號 :苦逼的碼農

但願看完讓你有所收穫,即是我最大的回報!

相關文章
相關標籤/搜索