常見的執行緒安全相關的面試題
阿新 • • 發佈:2018-11-30
HashMap 和 HashTable的區別
HashMap 和 HashTable都實現 Map介面,都是鍵值對儲存資料的方式
區別1:
- HashMap 可以存放 null
- HashTable 不能存放 null
區別二:
- HashMap 不是執行緒安全的類
- HashTable 是執行緒安全的類
StringBuffer 和 StringBuilder 的區別
區別1:
- StringBuffer 是執行緒安全的
- StringBuilder 是非執行緒安全的
所以當進行大量字串拼接操作的時候,如果是單執行緒就用StringBuilder會更快些(不需要同步,省略了些時間);如果是多執行緒,就需要用StringBuffer 保證資料的安全性。
ArrayList 和 Vector的區別
通過在eclipse中檢視原始碼可以得知:
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是非執行緒安全的。
把非執行緒安全的集合轉換為執行緒安全
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);
}
}