java进阶:15.5 多线程 - 合集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L20902/article/details/89319204

把非线程安全的集合转换为线程安全

之前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是非线程安全的。
 

猜你喜欢

转载自blog.csdn.net/L20902/article/details/89319204