使用并发集合

简介: 并发集合(线程安全),既然是并发集合。那就要知道什么是并发。

并发集合(线程安全),既然是并发集合。那就要知道什么是并发。

并发:同一时间间隔对资源的共享。

image.png

其中ConcurrentQueue,ConcurrentStack,ConcurrentBag避免使用上面提及的集合的Count属性,实现这些集合使用的是链表。Count时间复杂度为O(N).检查集合是否为空,使用IsEmpty属性,时间复杂度为O(1).

这里我们基本介绍下功能:

ConcurrentDictionary

单线程环境中的字典集合与使用并发字典的性能。

View Code

创建两个集合,其中一个是标准的字典集合,另一个是新的并发字典集合。采用锁的机制想标准的字典中添加元素。比较两者之间。我们发现ConcurrentDictionary写操作比使用锁的通常的字典要慢的多,而读操作则要快些。因此如果对字典需要大量的线程安全的操作。ConcurrentDictionary是最好的选择。

ConcurrentDictionary的实现使用了细粒度锁技术,在多线程写入方面比使用锁的通常的字典的可伸缩性更好。在本例中,当只用一个线程时,并发字典非常慢。但是扩展到5-6个线程,并发字典的性能会更好

如果你对字典只需要多线程访问只读元素,则没必要执行线程安全的读操作。在此场景中最好只使用通常的字典或者ReadOnlyDictionary集合。

image.png

ConcurrentQueue

创建能被多个工作者异步处理的一组任务的例子

View Code

image.png

我们使用ConcurrentQueue集合实例创建了一个任务队列,然后一个取消标志,用来在我们将任务放入队列后停止工作的。接下来启动了一个单独的工作线程来将任务放入任务队列中。现在定义该程序中消费任务的部分。我们创建了四个工作者,它们会随时等待一段时间,然后从任务中获取一个任务,处理该任务,一直重复整个过程直到我们发出取消标志信号。

ConcurrentStack异步处理

创建了被多个工作者异步处理的一组任务。

View Code

image.png

与之前的代码几乎一样。唯一不同之处是我们对并发堆栈使用Push和TryPop方法。而对并发队列使用Enqueue和TryDequeue方法。

处理的顺序被改变了了、堆栈是一个LIFO集合,工作者先处理最近的任务。在并发队列中,任务被处理的顺序与被添加的顺序几乎一致。在堆栈中,早先创建的任务具有较低的优先级。而且直到生产者停止向堆栈中放入更多的任务后,该任务才有可能停止。

ConcurrentBag

多个独立的既可以生产工作又可消费工作的工作者如果扩展工作量。

具体可以借鉴https://www.cnblogs.com/InCerry/p/9497729.html

相关文章
|
29天前
|
存储 安全 算法
java多线程之并发容器集合
java多线程之并发容器集合
|
安全 Java 容器
高并发编程之线程间通信和集合的线程安全
高并发编程之线程间通信和集合的线程安全
24 1
|
10月前
|
安全 Java 数据安全/隐私保护
JUC基础(四)—— 并发集合
JUC基础(四)—— 并发集合
90 0
|
12月前
|
存储 安全 Java
【JUC基础】11. 并发下的集合类
我们直到ArrayList,HashMap等是线程不安全的容器。但是我们通常会频繁的在JUC中使用集合类,那么应该如何确保线程安全?
|
SpringCloudAlibaba 安全 前端开发
JUC系列(三) 不安全的集合类
在多线程的情况下 我们常用的一些集合并不能保持线程的安全 那么我们该怎么办呢
JUC系列(三) 不安全的集合类
|
安全 Java 程序员
Java多线程编程之线程安全
在多线程环境下,访问相同的资源,有可以会引发线程不安全问题。
|
缓存 安全 Java
ConcurrentHashMap比其他并发集合的安全效率要高一些?
ConcurrentHashMap比其他并发集合的安全效率要高一些?
|
存储 安全 Java
java并发之CopyOnWriteArrayList
java并发之CopyOnWriteArrayList目录 概述成员属性构造方法添加元素获取元素修改元素删除元素迭代器总结set方法细节 ​ 我在前面总结了Java集合中ArrayList的源码细节,其中也提到了ArrayList是线程不安全的(没有做任何的同步保证),也说到了fast-fail机制以及多线程下使用ArrayList的异常问题。
740 0
|
Java 安全 缓存
Java并发-CopyOnWriteArrayList
Java并发-CopyOnWriteArrayList前言今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类。当有多个线程可能同时遍历、修改某个公共数组时候,如果不希望因使用synchronize关键字锁住整个数组而影响性能,可以考虑使用CopyOnWriteArrayList。
587 0
|
存储 算法 Java
并发容器与框架——并发容器(一)
参考资料《Java并发编程的艺术》
1425 0