java - Spring @Async 和同步

标签 java spring asynchronous concurrency junit

我有一个基于 Spring 的异步方法(用 @Async 注释)我想在错误事件发生一定次数的情况下暂停。由于可能有多个线程在做同样的事情,我尝试了一个静态的 AtomicInteger (MY_COUNT) 这样所有的线程都可以知道计数,并且利用 AtomicInteger 提供的内置并发。

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

问题:@Async 和同步之间是否存在某种底层交互?难道不能把两者结合起来吗?


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

最佳答案

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

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

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

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

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

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

关于java - Spring @Async 和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931930/

相关文章:

java - 停止 Tomcat 不会删除 Derby db.lck

c# - 用于实时应用程序的异步与同步套接字服务器

java - 无法在 android 中解析布局名称

java - 如何在Java Native Interface中获取Java "object"地址

spring - 何时创建存储库接口(interface) (jpaRepository) bean?

java - 使用spring jpa获取数据

c# - Task.WaitAll 的阻塞等待

javascript - promise 中的 promise ?

java - 最佳 Java 随机种子

java - 创建一个以集合为键的 map ?