我有一个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)的更多信息,以避免此错误。
答案 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
也就足够了。