线程安全的集合有哪些_线程安全集合

有一个多线程程序需要访问相同的数据吗?你需要线程安全集合!那么让我们从为什么我们需要线程安全集合开始,然后分解它们,他们如何工作?最后如何使用它们?

为什么需要:

设想一个系统,您需要同时从多个线程修改和访问数据。在相同的数据结构中!你可能会看到一个问题.....

想象一下,您正在开发一个财务平台,当同时完成多个事务时,您需要管理案例!这就像多辆汽车同时穿过一个十字路口!事故将在没有红绿灯的情况下发生......

现在这个问题可以在数据中以各种形式出现,比如:

1.同时进行多次写入。

2.同时读和写。

3.同时进行多次读取。

4.在写东西之前尝试读取。

因此,如果我们不想让内存损坏,我们需要控制和防止这些情况。一种解决方案是使用锁和信号量显式地编程。但这可能需要一些时间来实现,并且会使开发变得相当复杂。

另一种解决方案是使用已经有了这些实现的数据结构,通过使用它们的专用方法,我们可以在不太困难的情况下获得相同的结果。这些集合是线程安全的集合。

它们是什么:

线程安全集合是可以由多个线程同时访问的集合,同时不受争用条件限制。通过名称,我们可以直接理解它是一个集合,线程在任何时间点都可以安全地访问它。更具体地说,它可以是一个字典、一个FIFO队列、一个LIFO堆栈,它可以在不需要显式编程同步的情况下添加/删除项目。基本上,它是一种并发数据结构,更适合编程。

如何工作:

好吧,让我们回到前面提到的4个问题。有许多解决方案,但这里我们将使用下面的状态机来说明一些基本的解决方案:

首先,如果互斥锁被锁定,我们要等到它被解锁才能执行任何功能。当我们锁定互斥体时,只有锁定互斥体的线程才有权访问数据,而其他每个线程都必须等到它被解锁。

第二个问题可以简单地解决。如果我们需要写,我们首先锁定互斥,然后我们写,最后我们解锁。

当我们有多个读卡器时,只要在读卡过程中数据没有被修改,就不是什么大问题。因此,我们使用rlock为编写器锁定数据,所有的读卡器都可以读取数据,最后一个读卡器线程在完成后解锁互斥体。

第四个问题。我们需要能够检查是否有可用的值,如果有,我们读取该值。但如果它不可用,我们要等到有可用的时候!

怎么使用:

每种标准编程语言都有至少一个并发数据结构的实现。最简单的是FIFO队列。为了用多种语言说明一个解决方案,我们将使用生产者/消费者问题,在这个问题中,生产者的输出速度要比消费者的输出速度慢得多。这与上面提到的“在写东西之前尝试读取”问题有关。

程序将相当简单。我们将有一个每1秒产生一个值的线程。以及一个并行的消费线程,它会尽快消费一个值。

非线程安全数据的问题是,使用者在尝试使用其不能拥有的值时会创建一个错误。与此同时,它只需等待值准备好。

让我们在Java、Python和Golang 3种不同的编程语言中看到这个代码

java:

在java中你可以使用“java.util.concurrent”包。 包括:

BlockingQueue是一个阻塞FIFO队列。

ConcurrentHashMap是HashMap的并发模拟

ConcurrentSkipListMap是TreeMap的并发模拟。

在这里,您可以看到BlockingQueue的示例:

a1ac0edce3e0efff4b6a3e08c3b4a5ab.png

现在,如果您运行上面的代码,就会得到:

006a920c65e2852f9ea71f2b907acf93.png

Python

在Python中我们也有一些类似的功能:

Queue 实现了FIFO,LIFO和PriorityQueue

Deques支持任何一方的线程安全,内存效率附加和弹出。

因此,让我们看看与Java相同的程序,但在Python中的实现:

da4fc39b2a0ca1c44a104e12f292cf60.png

通过运行上面的代码,我们自然会得到相同的结果:

eae0cd4b3dddbec5922f56c82a4951f0.png

GO:

但在Golang中,我们对线程安全集合采用了不同的方法。我们在go中没有基本的队列实现。 在Go中,我们使用通道使代码更容易阅读:

0f677602ec3d9a5bf9af7ca67f8cb3c2.png

当然,我们得到了同样的结果:

5ac29625b34ab9f577459f6a3b8212ff.png

简而言之!线程安全集合在多线程编程中非常实用,它可以促进大部分开发。

其中一个集合的最基本示例是一个队列,古典编程语言已经实现了这个队列。我们可以修改这些数据结构,读取和写入值,轻松地使用已经到位的方法,而不存在任何并发问题。

原文:https://medium.com/elp-2018/thread-safe-collections-8f1f17c283e7

翻译:张春

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值