并发容器是解决多线程情况下,可以处理的集合。
对于分别有
List

  • copyOnWriteArrayList
    Set

  • copyOnWriteArraySet

  • concurrentSkipSet
    Map

  • concurrentHashMap

  • concurrentSkipListMap

Queue

  • BlockingQueue
  • ConcurrentLinkedQueue
  • BlockingDeque
  • ConcurrentLinkedDeque

CopyOnWriteArrayList
原理:利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。主要场景是读多写少的。
在新增数据的时候操作为

  • 加锁
  • 从原数据中拷贝出新数组
  • 在新数组中进行操作,并把新数组赋值给数组容器
  • 解锁

ConcurrentHashMap
数据结构,在1.8版本后为自旋+CAS+synchronized关键字来实现同步

阻塞队列
BlockingQueue是juc喜爱的数据结构,提供了线程安全的队列访问。
应用场景包括

  • 线程池:任务队列通常是一个阻塞队列
  • 消息队列
  • 缓存系统

ArrayBlockingQueue
是有界阻塞队列,其内部是用数组存储元素的,初始化时需要制定容量大小,利用ReentrantLocak实现线程安全。

ArrayBlockingQueue使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,也就是只能有一个线程可以进行入队或者出队操作;这也就意味着生产者和消费者无法并行操作,在高并发场景下会成为性能瓶颈

LinkedBlockingQueue
原理
内部由单链表实现,只能从head取元素,从tail添加元素
LinkedBlockingQueue采用两把锁的锁分离技术实现入队出队互不阻塞,添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐