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

 时间:2024-10-14 00:25:35

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 卡的选型指导和引脚定义
  • 纳米汗蒸与传统火龙浴汗蒸
  • 热门搜索
    我心中的红十字手抄报 儿童安全知识手抄报 关爱教育手抄报 安全意识手抄报 一年级手抄报大全简单 关于法制的手抄报内容 我运动我健康手抄报 交通安全漫画手抄报 森林防火手抄报图片 三年级英语手抄报