繁体   English   中英

如何通过Junit测试两个线程无法同时访问的同步对象?

[英]How to Junit test a synchronized object not accessed by two threads at same time?

有什么方法可以进行Junit测试,以确保两个线程无法同时访问同步对象(在我的情况下为HashMap)。 例如,强制两个线程尝试访问并引发异常。 谢谢你的帮助!

我看到的对线程测试有帮助的最佳框架是Thread Weaver 至少它提供了一些确定性的线程调度方式,以及一种试图找到竞争条件的有限(至今仍有用)的方式。

您甚至可以编写一些更复杂的线程调度方案,但是这些测试不可避免地将是白盒测试。 不过,这些也可以使用。

有什么方法可以进行Junit测试,以确保两个线程无法同时访问同步对象(在我的情况下为HashMap)。

我不确定是否有测试框架可以对此进行测试,但是您当然可以编写一些代码,尝试通过许多线程一次HashMap地访问受保护的HashMap 不幸的是,这很难可靠地完成,因为正如@Bohemian所提到的,无法确定线程如何运行和访问地图,尤其是在音乐会中。

例如,强制两个线程尝试访问并引发异常。 谢谢你的帮助!

是的,这不会发生有两个原因。 如前所述,没有“强制”线程。 您只是没有那种控制水平。 另外,除非您执行了synchronized(hashMap) { ... }之外的其他事情,否则线程不会因为同步问题而引发异常。 当一个线程在地图上持有锁时,其他线程将阻塞直到释放该锁。 这很难检测和控制。 如果添加代码进行检测和线程控制,那么您将陷入海森堡的情况,由于监视代码的原因,您将影响线程的行为。

测试正确的同步非常困难,而且通常无法做到。 与其他开发人员一起审阅代码,以确保您的HashMap 每次使用时都完全同步,这可能会提高工作效率。

最后,如果您担心HashMap那么您可能应该考虑移至ConcurrentHashMapCollections.synchronizedMap(new HashMap) 尽管您使用一个操作进行多个地图调用,但它们处理竞争条件,尽管它们处理竞争条件,但它们为您维护实际地图的同步和保护。 顺便说一句, HashTable被认为是旧类,不应使用。

希望这可以帮助。

据我了解,您有与此类似的代码

synchronized(myHashMap) {
    ...
}

...这意味着一个线程在进入同步块时将获取myHashMap提供的锁,而所有尝试进入同一块的其他线程都必须等待,即其他线程都无法获取同一锁

有什么方法可以进行Junit测试,以确保两个线程无法同时访问同步对象(在我的情况下为HashMap)。

了解了以上内容后,您为什么要这样做? 如果您仍然想尝试,那么您可能想看看这个答案

最后但并非最不重要。 我建议您使用Hashtable因为它已同步 使用ConcurrentHashMap

从本质上讲,您不能这样做,因为您无法控制线程的调度时间,更不用说协调它们来测试特定的行为了。

其次,并不是所有的构建服务器都是多线程的(几天前我就被这个问题咬了-便宜的AWS实例只有1个CPU),因此即使您知道更多可用的线程也不能依赖。

尝试重构代码,以便将锁定部分与应用程序分离,并隔离测试该逻辑……如果可以的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM