JAVA多线程基础:常用的并发的数据结构性能对比

List

ArrayList
  • ArrayList不是线程安全的数据结构,在多线程下尽量减少使用,可以使用下面方法包装ArrayList,变为线性安全的
Collections.synchronizedList(List list)
CopyOnWriteArrayList
  • 读取时:由于对象未发生改变,因此不需要加锁,性能高效
  • 修改时:先获取对象的一个副本,然后对副本进行修改
Vector
  • 读取:使用了同步关键字,所有的get()操作都必须先取得对象锁才能进行。在高并发的情况下,大量的锁竞争会拖累系统性能
  • 修改:也使用了同步关键字,但是Vector相对于CopyOnWriteArrayList更加高效(Synchronization)
总结
  • 读取更多时候,选择CopyOnWriteArrayList
  • 修改更多时:选择Vector

Set

  • 与List一样,也有一个包装类和CopyOnWriteArraySet
public static <T> Set<T> synchronizedSet(Set<T> s)

Map

  • 可以使用synchronizedMap方法得到一个线程安全的Map,但是性能不是最优
  • ConcurrentHashmap:性能高get()方法无锁,专门为线程并发而设计的HashMap,整体性能优于同步的HashMap

Queue

ConcurrentLinkedQueue
  • 适合高并发场景下的队列
  • 通过无锁的方式实现
  • 通常性能优于BlockingQueue
BlockingQueue
  • 是一个阻塞队列的接口
  • 主要作用是:简化多线程间的数据共享(重点),比如生产者和消费者模式中使用
  • 可以延迟提取或者添加数据
  • ArrayBlockingQueue:基于数组的阻塞队列
  • LinkedBlockingQueue:基于链表的阻塞队列

Deque

双端队列:double - ended Queue,允许从头部或者尾部进行出队或者入队操作

常用的子类
  • LinkedList:基于链表实现、但非线程安全
  • ArrayDeque:基于数组实现、拥有高效的随机访问、更好的遍历性能,但非线程安全
  • LinkedBlockingDeque:基于链表实现、虽然是线程安全的,但没有进行读写分离,他的性能表现远远低于LinkedBlockingQueue、CocurrentLinkedQueue
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值