1. 程式人生 > >常見的執行緒安全相關的面試題

常見的執行緒安全相關的面試題

HashMap 和 HashTable的區別

 HashMap 和 HashTable都實現 Map介面,都是鍵值對儲存資料的方式

區別1:

  • HashMap 可以存放 null
  • HashTable 不能存放 null

區別二:

  • HashMap 不是執行緒安全的類
  • HashTable 是執行緒安全的類

HashMap和Hashtable的區別


 

StringBuffer 和 StringBuilder 的區別

區別1:

  • StringBuffer 是執行緒安全的
  • StringBuilder 是非執行緒安全的

所以當進行大量字串拼接操作的時候,如果是單執行緒就用StringBuilder會更快些(不需要同步,省略了些時間);如果是多執行緒,就需要用StringBuffer 保證資料的安全性

StringBuffer和StringBuilder的區別


 

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);
    }
        
}