美文网首页程序员
java基础之常见线程安全与否的相关类

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

作者: 沈默的头号狗腿 | 来源:发表于2018-06-11 15:18 被阅读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)来将其转为线程安全。

    相关文章

      网友评论

        本文标题:java基础之常见线程安全与否的相关类

        本文链接:https://www.haomeiwen.com/subject/kzlheftx.html