- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近不得不完成其中一项工作面试编码练习。基本上它需要实现一个消息队列类:
我最后所做的并没有过多介绍细节,而是实现了一个 MessageQueue 类,该类在内部使用 ConcurrentSkipListMap(并发且有序的映射)来保存消息。
我还实现了一个基本的 JUnit 测试用例,用于测试基本业务需求。
现在它是一个消息队列,因此消息可以同时进入,当然我需要测试实现的发生方面。
我现在离问题的核心越来越近了。
我的想法是,当单个线程与实现交互时,基本的 JUnit 测试用例应该验证代码是否正常工作。
然后我实现了一个并发测试用例,它应该验证实现的发生方面。
现在问题来了:我应该同时测试哪些方面?
我唯一能想到的是让多个生产者线程在队列中注入(inject)方法,并让多个消费者线程删除消息(通过 getFront())。这里要验证的是,进入队列的消息最终会出来。
但这就够了吗?还有哪些其他并发方面可以在这里进行测试?
另外值得注意的是,我已经提交了解决方案,因此无论您提出什么建议,都不会影响我申请这份工作的机会。
最佳答案
线程安全测试是一件痛苦的事情,因为您基本上是在尝试为每个最终并发执行证明程序的正确性。有几种方法可以解决这个问题:
用 JMM 的术语正式证明你的程序的正确性。这将要求您讨论程序中每个明确的“先于发生”边缘,以及如何基于这些边缘保持一致性。这对于像队列这样基本的东西是可能的,但是随着更多的功能和优势被投入其中,它变得非常复杂。我建议您在任何情况下都完成这个过程,并在编写并发代码时记录您的意图/假设。
构建测试用例,通过使用倒计时锁存器或其他方法在程序的特定点暂停执行线程以强制争用来演示预期的上述行为。如果走得太远,这可能会使您的代码变得一团糟,但这可能是一种非常有用的技术。
通过在足够长的时间内运行代码,以统计方式证明正确性。这就是 concurrency torture suite 背后的原理用于验证关于 JMM 的 JVM 实现的正确性。这将要求您对参与线程的合法/非法状态形成期望,并在具有足够并行线程的机器上运行您的程序足够长的时间。如果您从未遇到过非法状态,那么您的程序就是正确的 :)。如果您运行它足够长的时间而没有遇到非法状态,那么您很可能是正确的。
关于java - 使用 ConcurrentSkipListMap 的并发测试队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14618982/
我尝试使用以下行从 ConcurrentSkipListMap 获取键数组: myArray=(String[])myMap.keySet().toArray(new String[myMap.siz
我有一个包含键和值的 ConcurrentSkipListMap。保持按键的顺序非常重要。 当我尝试在特定位置插入新值时出现问题。插入值的唯一方法是 put() ,将该值放在最后一个位置。 使用rep
我有这个容器 private ConcurrentMap> users; 在构造函数中初始化 users = new ConcurrentHashMap<>(); 对于每个用户,它都会得到 new C
我需要为 ConcurrentSkipListMap 定义一个自定义比较器,我使用此代码根据“LogicalClock”进行排序,但结果并不符合我的预期。我像这样创建 key :“ClientId”+
假设我有多个线程向 ConcurrentSkipListMap 添加条目和从中删除条目。我有另一个线程在预定义的时间段内运行集合并使用迭代器更新它的数据。考虑到并发访问如何做到这一点。如何迭代?迭代器
我有 N 个添加值的线程和一个删除线程。我正在考虑如何同步添加到现有值列表和删除列表的最佳方法。 我猜下面的情况是可能的: thread 1 checked condition containsKe
我正在使用“ConcurrentSkipListMap”(因为我的环境将是多线程的)和“比较器”根据其 ID 和日期对插入对象进行排序。在“TestObject”中,其名称将是唯一的。所以我用它作为
我有一张带有一些值的 map 。 public ConcurrentMap data = new ConcurrentSkipListMap<>(); 我如何反向迭代它? Java 迭代器似乎没有 n
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: When should I use ConcurrentSkipListMap? 我的意思是,如果 java
在 Java 中,ConcurrentHashMap 可以提供更好的 multithreading 解决方案。那我应该什么时候使用ConcurrentSkipListMap?是冗余吗? 这两者之间的多
最近在探索 ConcurrentSkipListMap 时,我浏览了它的实现,发现它的 put 方法不是线程安全的。它在内部调用 doPut 来实际添加项目。但我发现这个方法并没有使用任何类似于Con
我有一个程序,其中许多线程将其请求发送到 PriorityQueue 。随后,他们等待 ConcurrentSkipListMap 的回复。 。有一个线程发布了 ConcurrentSkipListM
假设我有一个 ConcurrentSkipListMap,我通过给它一个比较器来构造它,然后向其中添加几个键值对。当我向映射添加键时,根据设计,它会根据给定构造函数的比较器或其自然顺序对值进行排序。但
我对理解 ConcurrentSkipListMap 的并发性有疑问。 我有以下声明: ConcurrentSkipListMap> map 是不是也可以像下面这样使用呢? ConcurrentSki
ConcurrentSkipListMap.compute(K, BiFunction) 的 Javadoc状态: Attempts to compute a mapping for the spec
我最近不得不完成其中一项工作面试编码练习。基本上它需要实现一个消息队列类: 根据传入消息中的优先级字段维护项目。 消息可以属于高、中、低三个优先级类别之一,由 message.priorityFiel
我有一个ConcurrentSkipListMap。我需要删除低于 key 的元素。 下面是我如何执行它: private ConcurrentNavigableMap myObjectsMap =
为什么 ConcurrentSkipListMap 没有构造函数允许我们设置初始容量,如HashMap是吗? 最佳答案 因为这个数据结构是由多个 LinkedList 支持的初始容量构造函数参数对谁来
这篇文章的摘要:我有一组订购的物品,它们的顺序可能会随着时间的推移而改变。我需要能够从多个线程遍历这个集合,每个线程可能还想更新项目的顺序。 比如多个线程需要访问String以某种任意排序顺序的键。它
我想根据 API 文档澄清一些关于 ConcurrentHashMap 与 ConcurrentSkipListMap 的内容。 根据我的理解 ConcurrentHashMap 保证了多线程插入的线
我是一名优秀的程序员,十分优秀!