首页 > 编程知识 正文

用于线程安全的集合(redis崩溃恢复机制)

时间:2023-05-03 18:18:26 阅读:77580 作者:1822

多线程程序是否需要访问相同的数据? 需要线程安全收藏! 那么,为什么需要线程安全的收藏,以及需要分解它们,他们如何工作? 最后怎么使用它们?

为什么需要:

假设是系统,则需要同时从多个线程修改和访问数据。 在相同的数据结构中! 可能有问题.

想象一下,你在开发财务平台。 如果同时完成多个事务,则必须管理案例。 这就像多辆车同时通过十字路口一样! 事故在没有信号的情况下发生……。

当前,该问题可以以:等各种形式出现在数据中

1 .同时进行多次写入。

2 .读写同时进行。

3 .同时进行多次读取。

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

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

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

那些是什么:

线程安全集合是不受冲突条件的限制,可以同时由多个线程访问的集合。 从名称可以直接理解线程是一个可以随时安全访问的集合。 特别是词典、FIFO队列和LIFO堆栈,允许您添加/删除项目,而不需要显式编程同步。 基本上是并发数据结构,适合编程。

如何工作:

那么,让我们回到前面提到的四个问题。 有很多解决方案,但这里使用以下状态机来说明基本的解决方案。

首先,如果互斥锁定,则只有在解锁后才能执行功能。 锁定独占锁时,只有锁定独占锁的线程才能访问数据,其他每个线程必须等待解锁。

第二个问题很容易解决。 如果需要写,先打开独占锁,然后写,最后解锁。

如果有多个读卡器,那么如果在读卡过程中数据没有发生变化,就不是什么大问题了。 因此,可以使用rlock锁定写入程序中的数据,所有读卡器都可以读取数据,最后一个读卡器线程在完成后解锁互斥体。

第四个问题。 必须检查是否有可用的值,如果有,必须读取该值。 但是,如果那个不能使用的话,要等到可以使用的时候!

怎么用:

每个标准编程语言至少有一个并发数据结构实现。 最简单的是FIFO队列。 使用生产者/消费者问题以多种语言说明解决方案。 在这个问题上,生产者的输出速度远远慢于消费者的输出速度。 这与上述“在写东西之前试图读取”的问题有关。

程序会相当简单。 有一个线程每秒生成一个值。 然后是并行的消费线程,它会尽快消耗值。

非线程安全数据的问题是,如果尝试使用用户无法拥有的值,则会发生错误。 同时,只需等待值的准备。

让我们用三种不同的编程语言来看这段代码: Java、Python和Golang 3

java :

java可以使用" java.util.concurrent "包。 包括以下内容:

阻塞队列是阻止先进先出的队列。

并发混图是混图的同时模拟

ConcurrentSkipListMap是TreeMap的同时模拟。

现在,我们来看看BlockingQueue的示例。

运行上面的代码可以获得以下内容:

Python

Python也有类似的功能:

队列实现了FIFO、LIFO、优先级队列

Deques支持其中一个线程安全、添加内存效率和弹出窗口。

因此,我们使用与Java相同的程序,但让我们来看看它在Python上的实现:

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

GO :

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

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

简而言之! 线程安全集合在多线程编程中非常实用,促进了大多数开发。

集合最基本的例子之一是经典编程语言已经实现的队列。 可以修改这些数据结构,读取和写入值,并轻松使用已经建立的方法,同时不会出现问题。

译文: 3359 medium.com/elp-2018/thread-safe-collections-8 f1 f 17c 283 E7

翻译:俊秀的兔子

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。