Spring Bean默认是单例的,如何保证并发安全

一、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版权协议,转载请附上原文出处链接和本声明。