Spring是如何解决并发访问的线程安全性问题的

更新时间:2023-05-29 16:35:41 阅读: 评论:0

Spring是如何解决并发访问的线程安全性问题的
拼音学习班
springmvc的controller是singleton的(⾮线程安全的),这也许就是他和struts2的区别吧!和Struts⼀样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会⽤原有的instance去处理,这样导致了两个结果:⼀是我们不⽤每次创建Controller,⼆是减少了对象创建和垃圾收集的时间;由于只有⼀个Controller的instance,当多个线程调⽤它的时候,它⾥⾯的instance变量就不是线程安全的了,会发⽣窜数据的问题。当然⼤多数情况下,我们根本不需要考虑线程安全的问题,⽐如dao,rvice等,除⾮在bean中声明了实例变量。因此,我们在使⽤spring mvc 的contrller时,应避免在controller中定义实例变量。
如果控制器是使⽤单例形式,且controller中有⼀个私有的变量a,所有请求到同⼀个controller时,使⽤的a变量是共⽤的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。。
有⼏种解决⽅法:
1、在Controller中使⽤ThreadLocal变量
bpmf教案
2、在spring配置⽂件Controller中声明 scope="prototype",每次都创建新的controller
开业庆典祝福语
所在在使⽤spring开发web 时要注意,默认Controller、Dao、Service都是单例的。
饺子文化
ThreadLocal 使⽤范例:
ThreadLocal<Long>startTime = new ThreadLocal<Long>();  定义⼀个ThreadLocal 变量
糖醋虾仁
startTime.t(System.currentTimeMillis());  写⼊值
情感的句子();  读取值
ThreadLocal和线程同步机制相⽐有什么优势呢?
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
大学英语四
在同步机制中,通过对象的锁机制保证同⼀时间只有⼀个线程访问变量。这时该变量是多个线程共享的,使⽤同步机制要求程序慎密地分析什么时候对变量进⾏读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较⼤。
⽽ThreadLocal则从另⼀个⾓度来解决多线程的并发访问。ThreadLocal会为每⼀个线程提供⼀个独⽴的变量副本,从⽽隔离了多个线程对数据的访问冲突。因为每⼀个线程都拥有⾃⼰的变量副本,从⽽
也就没有必要对该变量进⾏同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
store概括起来说,对于多线程资源共享的问题,同步机制采⽤了“以时间换空间”的⽅式,⽽ThreadLocal采⽤了“以空间换时间”的⽅式。前者仅提供⼀份变量,让不同的线程排队访问,⽽后者为每⼀个线程都提供了⼀份变量,因此可以同时访问⽽互不影响。

本文发布于:2023-05-29 16:35:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/807743.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:变量   线程   访问
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图