Spring StopWatch并发

时间:2017-12-15 09:49:27

标签: java spring concurrency stopwatch

我有一个Bean配置如下:

    @Bean(name = "myStopWatch")
    @Scope(value = "prototype")
    public MyStopWatch myStopWatch() {
       return new MyStopWatch();
    }

MyStopWatch类如下:

import org.springframework.util.StopWatch;

public class MyStopWatch {

   private StopWatch sw = new StopWatch();

   public void start() {
       if(!sw.isRunning()) {
           sw.start();
       }
   }

   public void stop() {
       if(sw.isRunning()) {
           sw.stop();
       }
   }
}

我们在高度并发的环境中使用这个bean。如果我的理解是正确的,那么永远不应该在线程之间共享MyStopWatch类,对吧?

但是,我们有时(很少)会收到以下错误:

  

java.lang.IllegalStateException:无法启动StopWatch:它已经存在   跑来跑去   org.springframework.util.StopWatch.start(StopWatch.java:127)at   org.springframework.util.StopWatch.start(StopWatch.java:116)

到目前为止,我们无法通过测试重现此行为。我正在寻找有关如何正确定义 sw 变量(或ma bean)的更多信息,以避免此错误。

2 个答案:

答案 0 :(得分:1)

你的假设是错误的。将bean声明为<div style="padding-bottom: 1rem;"> <form> <input type="text" id="general-link"> <input type= "button" id="link" value="Download"> </form> </div> <div style="font-size: 1.5rem"> <p id="1"></p> </div>并不能确保线程安全。有关详细信息,请参阅this answer

就使用Spring prototype而言,the documentation表示它不是设计为线程安全的,也不是用于生产。

答案 1 :(得分:0)

首先,它不是线程安全的,文档说的是这样。将bean作为prototype并不意味着不能有多个线程同时更新它,这只意味着当你要求这样一个bean时 - 一直返回一个新实例(当使用{{1时)例如,}或getBean

如果你想测量经过的时间(做多少事情),请从Spring继续@Autowired。如果你有guava它也有一个StopWatch - 使用它(它仍然不是线程安全的),否则你想要分析的代码的每个部分内的简单StopWatch也就足够了。