多線程 面試會問到的線程安全類

1. HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map接口,都是鍵值對保存數據的方式
區別1:
HashMap可以存放 null,Hashtable不能存放null
區別2:
HashMap不是線程安全的類,Hashtable是線程安全的類
在這裏插入圖片描述

2. StringBuffer和StringBuilder的區別

StringBuffer 是線程安全的,StringBuilder 是非線程安全的
所以當進行大量字符串拼接操作的時候,如果是單線程就用StringBuilder會更快些,如果是多線程,就需要用StringBuffer 保證數據的安全性

非線程安全的爲什麼會比線程安全的 快? 因爲不需要同步,省略了些時間
在這裏插入圖片描述

3. ArrayList和Vector的區別

通過查看源代碼可以得知:
ArrayList類的聲明:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 

Vector類的聲明:

public class Vector<E>    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

一模一樣的~
他們的區別也在於,Vector是線程安全的類,而ArrayList是非線程安全的。
在這裏插入圖片描述

4. 怎樣把ArrayList轉換爲線程安全的List

ArrayList是非線程安全的,換句話說,多個線程可以同時進入一個ArrayList對象的add方法,藉助Collections.synchronizedList,可以把ArrayList轉換爲線程安全的List。與此類似的,還有HashSet,LinkedList,HashMap等等非線程安全的類,都通過工具類Collections轉換爲線程安全的

package multiplethread;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestThread {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = Collections.synchronizedList(list1);
    }    
}

我們查看Collections源碼會發現Collections.synchronizedList實現大的就是在你傳過來的list基礎上,new了一個SynchronizedList。
在這裏插入圖片描述
我們繼續往下查看SynchronizedList的源碼發現。
在這裏插入圖片描述
SynchronizedList把參數list傳給了this的list,這個list的所有方法都被synchronized修飾了。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章