把非線程安全的集合轉換爲線程安全
之前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是非線程安全的。