我有一个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类不应该在线程之间共享,对吗?
但是,有时(很少)会出现以下错误:
org.springframework.util.StopWatch.start(StopWatch.java:127):无法启动StopWatch:它已经在org.springframework.util.StopWatch.start(StopWatch.java:116)的java.lang.IllegalStateException上运行
到目前为止,我们还不能用测试来再现这种行为。为了避免这个错误,我正在寻找更多关于如何正确定义我的sw变量(或ma )的信息。
发布于 2017-12-15 10:11:03
发布于 2017-12-15 11:36:53
首先,它不是线程安全,文档是这么说的。将bean作为prototype并不意味着不能有多个线程同时更新它,它只是意味着当您请求这样一个bean时-一个新实例总是会被返回(例如,当使用getBean或@Autowired时)。
如果您想要测量经过的时间(做某事花费了多少时间),从Spring开始不要使用StopWatch。如果您有番石榴,它也有一个StopWatch --使用它(它仍然不是线程安全的),否则,您想要配置的代码的每个部分中的一个简单的System.nanoTime也就足够了。
https://stackoverflow.com/questions/47829665
复制相似问题