把非线程安全的集合转换为线程安全
之前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是非线程安全的。