您如何在Java中单独测试安全发布保证?

具体:

我有一个Cache接口,它有一个getOrLoad方法(K键,ObjectLoader加载器)。事实是,如果Cache无法找到给定键的对象,那么它必须从ObjectLoader实例加载它。但是,需要Cache来保证从加载器加载对象并将其放入Cache中的行为构成一个安全的出版物。

我现在正在为这个Cache接口编写一个通用的junit测试,我想知道如何测试Cache实现是否遵循这个安全的发布保证。

有什么想法吗?实际代码位于代码存储库的test-systest模块部分,以防您想要查看真实文件。

有帮助吗?

解决方案 2

我发现了 JavaOne演示文稿 by Bill Pugh,Brian Goetz和Cliff点击测试并发代码的主题。他们提出了这种方法,我认为这是我听过的最好的方法:

许多生成器使用依赖于状态的hashCode实现创建有状态和线程不安全的对象。当对象通过假定的同步点发送时,hashCodes被总结(线程本地)。同样,门的另一侧的消费者总结了hashCodes。

在测试结束时,我们分别总结了生产者和消费者的所有结果。如果两个总和相等,则测试通过。

我们也可以使用XOR作为总和的替代方案。事实上,任何交换操作都可以。请记住,测试工具本身不得引入任何其他同步。

其他提示

也许您可以使用 ConTest 来至少让您更有信心你的代码是正确的。

您需要实现几个同时运行多个线程的测试。然后,ConTest将通过检测字节代码来增加实际显示并发错误的可能性(添加启发式控制的条件睡眠和产生指令)。

实际上由于不安全的发布而导致错误是非常困难的(如果有人知道如何,请告诉我)。静态分析是自动化解决方案的最佳选择。我会坚持代码审查,而不是过分担心它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top