我的问题是关于 Spring Controller 上的线程安全(最后是 Servlet 类)。
1)如果我定义一个varibale static final int i =0,会导致线程安全问题,但是,我已经声明了static和final 2)如何将 enum 声明为全局变量(如 protected enum Mytype{start, stop})? 3)decalring @Autowired 是线程安全的吗?
我找到了一篇关于此的好文章,但我需要更清楚地了解上述问题。 Refer
代码:
@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?
.....
}
最佳答案
这与其说是一个 Spring 问题,不如说是一个一般的多线程问题。除了我们可以假设 Controller 是一个急切实例化的单例(这意味着在这种情况下静态和非静态变量之间实际上没有区别)之外,您所问的问题都不是特定于 Spring 的。另外,@Autowired 与线程安全无关。在您的示例中,这只是一个非最终包私有(private)字段(因为这是默认值)。
话虽如此,任何引用不可变对象(immutable对象)(如字符串)或基元的最终变量本质上都是线程安全的,因为它无法更改。
如果多个线程可以访问一个变量,并且该变量的值可以更改,那么它就不是线程安全的,除非发生某种形式的同步。
关于java - Spring Controller 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991480/