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)来将其转为线程安全。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值