Spring @Async和Synchronized

时间:2011-10-28 16:14:34

标签: java spring asynchronous concurrency junit

我有一个基于Spring的异步方法(注释为@Async),我想在错误事件发生一定次数的情况下暂停。由于可能有多个线程执行相同类型的操作,因此我尝试了静态AtomicIntegerMY_COUNT),以便所有线程都可以知道计数,并使用内置的并发AtomicInteger提供。

在我的单元测试中(在Eclipse中使用SpringJUnit4ClassRunner运行),一切顺利,直到线程命中MY_COUNT.incrementAndGet()。然后线程就消失了。没有例外,没有。异步工作线程就消失了。我尝试取出AtomicInteger并使用synchronized方法,但同样的事情发生了。

问题:@Async和同步之间是否存在某种引擎间的互动?是不是可以将两者结合起来?


编辑:更多信息:它似乎与同步范围有关(如果这是正确的术语)。一旦我从计数器变量中删除static指定,它仍然被轰炸;但是当我将其更改为Integer并将增量代码移动到其自己的同步方法时,代码继续进行。我没有调试底层的Spring代码;是否有任何春季专家可能能够阐明这种行为?

1 个答案:

答案 0 :(得分:4)

不,异步不应该影响原子整数的行为。

根据给定的信息,唯一合乎逻辑的结论是存在一些未被报告的异常。

如果可以,请尝试设置Uncaught异常处理程序

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html

在处理程序中,确保至少打印出跟踪。

如果这不能为您提供解决方案,或者您在设置未捕获的异常处理程序时遇到问题,请发布您的代码,以便我们为您提供帮助。