SpringMVC中,Controller等是否是线程安全的?

 时间:2026-02-12 04:16:01

1、首先,搭建好Spring项目。然后创建对应的Controller、UserService和UserDao类。这里,Controller、UserService和UserDao都定义了自己的变量,分别为a、us和ud。这里,Controller、UserService和UserDao都采用了单例模式。

SpringMVC中,Controller等是否是线程安全的?

SpringMVC中,Controller等是否是线程安全的?

SpringMVC中,Controller等是否是线程安全的?

2、我们分别用Chrome和Firefox访问test1.jspx,会得到如下图的结果:

SpringMVC中,Controller等是否是线程安全的?

SpringMVC中,Controller等是否是线程安全的?

3、这里,我们是先在Firefox中访问test1.jspx,等待2秒钟后,在从Chrome访问。可以看到:

(1)    两个浏览器各自对应着自己的线程;

(2)    从Controller -> Service -> Dao整个过程,都是一个线程!

(3)    由于Controller、Service和Dao都配置为单例模式,而从结果来看,a、us、ud出现了线程安全的问题。可以证明,单例模式下,Controller、UserService和UserDao都不是线程安全的。

这里,a值相等是因为,Firefox对a加1之后,等待了5秒钟让Chrome进入,Chrome进入修改的速度是很快的,Chrome也对a加1,此时,a变为2。然后,Firefox和Chrome分别返回,所以a值都为2。

4、要解决三者的线程安全问题,可以考虑采用prototype模式,或者使用ThreadLocal。

SpringMVC中,Controller等是否是线程安全的?

5、我们对Controller进行ThreadLocal改进(如上图所示),改进后,依然按照先Firefox后Chrome的顺序进行访问:

可以看出,a值现在已经是独立的了,Firefox和Chrome各自拥有自己的a值。而没有使用ThreadLocal改造的UserDao和UserService依然存在线程安全问题。

SpringMVC中,Controller等是否是线程安全的?

SpringMVC中,Controller等是否是线程安全的?

6、ThreadLocal用于改造Session的一个经典例子:

private static final ThreadLocal threadSession = new ThreadLocal();

public static Session getSession() throws InfrastructureException {

    Session s = (Session) threadSession.get();

    try {

        if (s == null) {

            s = getSessionFactory().openSession();

            threadSession.set(s);

        }

    } catch (HibernateException ex) {

        throw new InfrastructureException(ex);

    }

    return s;

}

  • CentOS7 挂载U盘
  • 痰中带血丝是怎么回事
  • 怎么选择好的SSD固态硬盘?看品牌、颗粒、主控
  • LCUSB-131A 系列 CAN 卡的选型指导和引脚定义
  • 纳米汗蒸与传统火龙浴汗蒸
  • 热门搜索
    福州旅游景点大全 美国旅游胜地 广西梧州旅游景点 美国东海岸旅游攻略 旅游产品营销方案 饶平旅游景点大全 关于旅游的ppt 康辉旅行社旅游线路 井冈山旅游网 青岛旅游图片