【发布时间】:2017-05-29 18:27:23
【问题描述】:
我正在制定一个 JMeter 测试计划,旨在对 Web 服务进行性能测试。整个测试计划的主要部分包括两个步骤。
- 从服务器检索 ID 列表(通过 Get-request)
- 获取其中一个 ID 并对其进行处理(通过 Post-request)
如果我使用单线程计划,一切都会按预期进行,但是一旦我使用多个线程,我就会进入竞争状态。问题是,第 2 步更改了可用 ID 列表,因此:如果线程 B 在线程 A 完成第 2 步之前检索 ID 列表,则线程 B 可能会获得与线程 A 相同的 ID,这会在线程 B 时导致错误试图完成第 2 步。不知何故,这是多线程环境中竞争条件的经典示例。 由于 JMeter 不提供定义关键代码块的可能性,我决定编写自己的自定义 Java 采样器,扩展 JMeter-AbstractJavaSamplerClient,覆盖 runTest() a.s.o。在 runTest() 实现中,我获取了 ReentrantLock 并使用它来锁定关键代码块。关键是,JMeter 似乎并不关心那个锁,我根本不明白为什么......如果我使用 Eclipse 通过远程调试来调试我的代码,我看到几个线程同时进入锁定的代码, 不应该是这样的。我还尝试了使用 synchronize 完成 runTest() 实现的老式方法,但这也不起作用。
有没有人有什么需要改变的建议?或者至少解释一下为什么这不起作用?
提前致谢!
【问题讨论】:
标签: java multithreading synchronization jmeter