java基础之常见线程安全与否的相关类
java中有些类实现功能大同小异,他们最大的区别就在于是否是线程安全的。
- StringBuilder 与 StringBuffer
- 这两种类内部都维护了一个字符数组,不同于 String 类中的final所修饰的字符数组,这两种类都可不断地向字符数组中加入字符,也就是一种可变的字符序列。所以当需要进行大量的字符串拼接时可使用这两种类。
- 他们的区别在于, StringBuffer 是线程安全的,而 StringBuilder 是线程不安全的,造成这种区别的原因是StringBuffer中的方法都被 synchronized 所修饰。
- Vector 与 ArrayList
- 这两种类都采用线性连续存储空间,即通过数组来存储数值,且他们都是 List 接口的实现类,List的实现类还有一个LinkedList
- 不同之处在于,
- 其一,Vector 是线程安全的,而 ArrayList 是线程不安全的,这同样是由于 Vector 的方法被 synchronized 所修饰而造成的。
- 其二,当存储空间不同时, Vector 默认增长至原来容量的 两倍 ,而 ArrayList 增长至原来的 1.5倍 。
- 其三, Vector 能通过 capacityIncrement 方法来设置每次增加多少存储容量,而 ArrayList 则不可以。
- HashMap 与 Hashtable
- 这两种类都是通过hash算法来判断数据存储位置,且都实现了Map接口(Hashtable是在JDK4中被重写了,实现了Map接口),通过键值对的方式存储数据。
- 不同之处在于,
- 其一, HashMap 是线程不安全的, Hashtable 是线程安全的,同样是由于 Hashtable 的方法被 synchronized 修饰造成。
- 其二, HashMap 可以接收键值(key)为null或者value为null的键值对,而 Hashtable 不行。
- 其三, HashMap 与Hashtable的 迭代器 不同, HashMap 的迭代器是 Iterator 类型的,而 Hashtable 的迭代器是 Enumerator 类型的。
- 在 JDK5 中提供了 ConcurrentHashMap ,它也是线程安全的,它是Hashtable的替代品,他的扩展性比Hashtable更好。
以上几种类中线程安全的比线程不安全的执行速度更慢,当我们想要将线程不安全的类同步时,我们可以通过 Collections 的三个方法synchronizedList(list),synchronizedSet(set),synchronizedMap(map)来将其转为线程安全。
相关推荐
zhuyonge 2020-08-01
fraternityjava 2020-06-26
三动 2020-06-21
fengyun 2020-06-14
付春杰Blog 2020-05-31
zhuyonge 2020-05-09
luohui 2020-04-29
fraternityjava 2020-04-29
shayuchaor 2020-04-20
fengyun 2020-04-17
gongruitao 2020-03-05
zhuyonge 2020-07-26
Hy 2020-11-13
xrslt 2020-11-06
yutian0 2020-10-26
杨树 2020-09-21
xiaoemo0 2020-07-18