0

我的问题是关于 Spring 控制器上的线程安全(最后是 Servlet 类)。

1) 如果我定义一个变量 static final int i =0,它会导致线程安全问题,但是,我已经声明了 static 和 final 2) 将 enum 声明为全局变量,如受保护的 enum Mytype {start,stop} 怎么样?3) 贴花@Autowired 是线程安全的吗?

我已经找到了一篇很好的文章,但我需要更清楚地了解上述问题。 参考

代码:

@Controller
Public class Test{
@Autowired MyTest mt;  // Autowired, thread safe?
private final String s = "abc"; // final, threadsafe?
private static final int i =0; // again final threadsafe?
private static int x = 0; // only static threadsafe?    
protected enum Mytype{head, tail}; // enum, threadsafe?
.....
}
4

1 回答 1

3

这与其说是一个 Spring 问题,不如说是一个一般的多线程问题。除了我们可以假设 Controller 是一个热切实例化的 Singleton 之外,您所问的任何内容都不是 Spring 特有的(这意味着在这种情况下,静态变量和非静态变量实际上没有区别)。此外,@Autowired 与线程安全无关。在您的示例中,这只是一个非最终的包私有字段(因为这是默认值)。

话虽如此,任何引用不可变对象(如字符串)或原语的最终变量都是天生的线程安全的,因为它不能更改

如果多个线程可以访问一个变量,并且该变量的值可以更改,那么除非发生某种形式的同步,否则它不是线程安全的。

于 2013-06-07T19:33:46.047 回答