Spring Controller线程安全

时间:2013-06-07 19:21:13

标签: java spring servlets spring-mvc

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

1)如果我定义一个varibale static final int i = 0,它会导致线程安全问题,但是,我已经声明了static和final 2)将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?
.....
}

1 个答案:

答案 0 :(得分:3)

这不是一个Spring问题,而是一个通用的多线程问题。你没有问过什么是特定于Spring的,除了我们可以假设Controller是一个热切实例化的Singleton(这意味着在这种情况下静态和非静态变量之间实际上没有区别)。此外,@ Autowired与线程安全无关。在您的示例中,这只是一个非最终的包 - 私有字段(因为这是默认值)。

话虽如此,引用不可变对象(如String)或基元的任何最终变量都是天生的线程安全,因为无法更改

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