java基础之常见线程安全与否的相关类

java中有些类实现功能大同小异,他们最大的区别就在于是否是线程安全的。

  • StringBuilderStringBuffer
  • 这两种类内部都维护了一个字符数组,不同于 String 类中的final所修饰的字符数组,这两种类都可不断地向字符数组中加入字符,也就是一种可变的字符序列。所以当需要进行大量的字符串拼接时可使用这两种类。
  • 他们的区别在于, StringBuffer 是线程安全的,而 StringBuilder 是线程不安全的,造成这种区别的原因是StringBuffer中的方法都被 synchronized 所修饰。
  • VectorArrayList
  • 这两种类都采用线性连续存储空间,即通过数组来存储数值,且他们都是 List 接口的实现类,List的实现类还有一个LinkedList
  • 不同之处在于,
  • 其一,Vector 是线程安全的,而 ArrayList 是线程不安全的,这同样是由于 Vector 的方法被 synchronized 所修饰而造成的。
  • 其二,当存储空间不同时, Vector 默认增长至原来容量的 两倍 ,而 ArrayList 增长至原来的 1.5倍
  • 其三, Vector 能通过 capacityIncrement 方法来设置每次增加多少存储容量,而 ArrayList 则不可以。
  • HashMapHashtable
  • 这两种类都是通过hash算法来判断数据存储位置,且都实现了Map接口(Hashtable是在JDK4中被重写了,实现了Map接口),通过键值对的方式存储数据。
  • 不同之处在于,
  • 其一, HashMap 是线程不安全的, Hashtable 是线程安全的,同样是由于 Hashtable 的方法被 synchronized 修饰造成。
  • 其二, HashMap 可以接收键值(key)为null或者value为null的键值对,而 Hashtable 不行。
  • 其三, HashMapHashtable迭代器 不同, HashMap 的迭代器是 Iterator 类型的,而 Hashtable 的迭代器是 Enumerator 类型的。
  • JDK5 中提供了 ConcurrentHashMap ,它也是线程安全的,它是Hashtable的替代品,他的扩展性比Hashtable更好。

以上几种类中线程安全的比线程不安全的执行速度更慢,当我们想要将线程不安全的类同步时,我们可以通过 Collections 的三个方法synchronizedList(list)synchronizedSet(set)synchronizedMap(map)来将其转为线程安全。

java基础之常见线程安全与否的相关类

相关推荐