首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring StopWatch并发

Spring StopWatch并发
EN

Stack Overflow用户
提问于 2017-12-15 09:49:27
回答 2查看 5.8K关注 0票数 5

我有一个Bean,配置如下:

代码语言:javascript
复制
    @Bean(name = "myStopWatch")
    @Scope(value = "prototype")
    public MyStopWatch myStopWatch() {
       return new MyStopWatch();
    }

MyStopWatch类如下所示:

代码语言:javascript
复制
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类不应该在线程之间共享,对吗?

但是,有时(很少)会出现以下错误:

org.springframework.util.StopWatch.start(StopWatch.java:127):无法启动StopWatch:它已经在org.springframework.util.StopWatch.start(StopWatch.java:116)的java.lang.IllegalStateException上运行

到目前为止,我们还不能用测试来再现这种行为。为了避免这个错误,我正在寻找更多关于如何正确定义我的sw变量(或ma )的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-15 10:11:03

你的假设是错误的。将bean声明为prototype并不能确保线程安全。有关更多细节,请参见这个答案

至于使用Spring的StopWatch goes,文献资料声明它不是设计为线程安全的,也不是用于生产中的。

票数 1
EN

Stack Overflow用户

发布于 2017-12-15 11:36:53

首先,它不是线程安全,文档是这么说的。将bean作为prototype并不意味着不能有多个线程同时更新它,它只是意味着当您请求这样一个bean时-一个新实例总是会被返回(例如,当使用getBean@Autowired时)。

如果您想要测量经过的时间(做某事花费了多少时间),从Spring开始不要使用StopWatch。如果您有番石榴,它也有一个StopWatch --使用它(它仍然不是线程安全的),否则,您想要配置的代码的每个部分中的一个简单的System.nanoTime也就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47829665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档