gpt4 book ai didi

java - 使用 ConcurrentSkipListMap 的并发测试队列

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:35 26 4
gpt4 key购买 nike

我最近不得不完成其中一项工作面试编码练习。基本上它需要实现一个消息队列类:

  • 根据传入消息中的优先级字段维护项目。
  • 消息可以属于高、中、低三个优先级类别之一,由 message.priorityField 值范围控制。
  • 有 getSize 和 isEmpty 方法。
  • 有一个 place(message) 方法。
  • 有一个删除方法。
  • 有 getFront() 方法(返回最高优先级的消息)

我最后所做的并没有过多介绍细节,而是实现了一个 MessageQueue 类,该类在内部使用 ConcurrentSkipListMap(并发且有序的映射)来保存消息。

我还实现了一个基本的 JUnit 测试用例,用于测试基本业务需求。

现在它是一个消息队列,因此消息可以同时进入,当然我需要测试实现的发生方面。

我现在离问题的核心越来越近了。

我的想法是,当单个线程与实现交互时,基本的 JUnit 测试用例应该验证代码是否正常工作。

然后我实现了一个并发测试用例,它应该验证实现的发生方面。

现在问题来了:我应该同时测试哪些方面?

我唯一能想到的是让多个生产者线程在队列中注入(inject)方法,并让多个消费者线程删除消息(通过 getFront())。这里要验证的是,进入队列的消息最终会出来。

但这就够了吗?还有哪些其他并发方面可以在这里进行测试?

另外值得注意的是,我已经提交了解决方案,因此无论您提出什么建议,都不会影响我申请这份工作的机会。

最佳答案

线程安全测试是一件痛苦的事情,因为您基本上是在尝试为每个最终并发执行证明程序的正确性。有几种方法可以解决这个问题:

  1. 用 JMM 的术语正式证明你的程序的正确性。这将要求您讨论程序中每个明确的“先于发生”边缘,以及如何基于这些边缘保持一致性。这对于像队列这样基本的东西是可能的,但是随着更多的功能和优势被投入其中,它变得非常复杂。我建议您在任何情况下都完成这个过程,并在编写并发代码时记录您的意图/假设。

  2. 构建测试用例,通过使用倒计时锁存器或其他方法在程序的特定点暂停执行线程以强制争用来演示预期的上述行为。如果走得太远,这可能会使您的代码变得一团糟,但这可能是一种非常有用的技术。

  3. 通过在足够长的时间内运行代码,以统计方式证明正确性。这就是 concurrency torture suite 背后的原理用于验证关于 JMM 的 JVM 实现的正确性。这将要求您对参与线程的合法/非法状态形成期望,并在具有足够并行线程的机器上运行您的程序足够长的时间。如果您从未遇到过非法状态,那么您的程序就是正确的 :)。如果您运行它足够长的时间而没有遇到非法状态,那么您很可能是正确的。

关于java - 使用 ConcurrentSkipListMap 的并发测试队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14618982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com