一、Spring中的Bean并不都是线程安全
Spring的Bean默认都是单例的,某些情况下,单例是并发不安全的,以Controller举例,问题根源在于,我们可能会在Controller中定义成员变量,如此一来,多个请求来临,进入的都是同一个单例的Controller对象,并对此成员变量的值进行修改操作,因此会互相影响,无法达到并发安全(不同于线程隔离的概念,后面会解释到)的效果。
首先来举个例子,证明单例的并发不安全性:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class DemoController {
private int i;
@GetMapping("testsingleton")
@ResponseBody
public int testsingleton() {
return ++i;
}
}
多次访问此 url,可以看到每次的结果都是自增的,所以这样的代码显然是并发不安全的。
版权声明:本文为y_bccl27原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。