我有两个类SomeService和Dependency配置并通过Spring连接:
@Named
public class SomeService implements Service
{
@Inject
public Dependency dependency;
public void execute()
{
dependency.execute();
}
}
@Named
public class Dependency
{
public void execute()
{
}
}
在极少数情况下,SomeService.execute()会抛出NPE。我想这个问题是非最终/非易失性字段无法在没有外部同步的情况下从不同的线程访问。非常明显的解决方法是使Dependency字段最终并用构造函数注入替换字段注入。但我试图使用一个启动ApplicationContext的线程和其他几个尝试获取SomeService的线程来重现我本地计算机上的初始错误。在所有情况下,依赖性从未为空。是否有可能使测试用例重现问题? 先感谢您。
答案 0 :(得分:0)
这样的并发错误有时难以在单插槽硬件上重现,因为由于共享(L3)缓存,核心在内存位置看到不同值的时间很短。在多插槽服务器硬件上,由于跨节点同步内存的时间较长,因此可能更容易。这也是限制大型机器的可扩展性的原因。如果你在小型机器上进行开发和测试,但是运行大铁,这将会让你感到很痛苦。
无论如何,这是一个经典的并发陷阱,使用final
可以轻松避免,正如您和其他人所提到的那样。
因此,您可能会在多插槽硬件上看到它更容易/更频繁,但当然无法保证。