程序员

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

2018-06-11  本文已影响9人  沈默的头号狗腿

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

- StringBuilderStringBuffer

这两种类内部都维护了一个字符数组,不同于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不行。

其三,HashMapHashtable迭代器不同,HashMap的迭代器是Iterator类型的,而Hashtable的迭代器是Enumerator类型的。

JDK5中提供了ConcurrentHashMap,它也是线程安全的,它是Hashtable的替代品,他的扩展性比Hashtable更好。

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

上一篇下一篇

猜你喜欢

热点阅读