java進階:15.5 多線程 - 合集

把非線程安全的集合轉換爲線程安全

之前13章學過的集合框架,Java 合集框架爲線性表、集合和映射表。

Java 合集框架中的類不是線程安全的;也就是說,如果它們同時被多個線程訪問和更新,它們的內容可能被破壞。可以通過鎖定合集或者同步合集來保護合集中的數據。

Collections 類提供6 個靜態方法來將合集轉成同步版本:同步包裝類 ,這些方法使用 synchronized 關鍵字來 實現
在這裏插入圖片描述同步合集可以很安全地被多個線程併發的訪問和修改。
例如:

	public boolean add(E o){
		synchronized (this) {
			return c.add(o);
		}
	}

這些同步包裝類都是線程安全的,但是迭代器具有快速失效的特性。這就意味着當使用一個迭代器對一個合集進行遍歷,而其依賴的合集被另一個線程修改時,那麼迭代器會拋出異常java. util.ConcurrentModificationException 報錯,該異常是RuntimeException 的一個子類。爲了避免這個錯誤,需要創建一個同步合集對象,並且在遍歷它時獲取對象上的鎖。例如

	Set hashSet = Collections.synchronizedSet(new HashSet());
	synchronized(hashSet){
		Iterator iterator = hashSet.iterator();
		while (iterator.hasNext()){
			System.out.println(iterator.next());

 
 

HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map接口,都是鍵值對保存數據的方式

區別1:

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

區別2:

  • HashMap不是線程安全的類
  • Hashtable是線程安全的類
     

StringBuffer和StringBuilder的區別

StringBuffer 是線程安全的
StringBuilder 是非線程安全的

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

ArrayList和Vector的區別

Vector是線程安全的類,而ArrayList是非線程安全的。
 

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