面试官问: 请问spring是线程安全的吗?
你: 不是线程安全的!!!!
面试官问: 为什么不是线程安全的?
你:因为Spring是单例的。
面试官问:为什么单例的就不是线程安全的那
你:what!!!
如果只是回答道这里,那结果可想而知。一般面试官问的这些问题,我觉得是有两层意思,一个意思是就是考你是否知道这个点,另一是考下你的理解。
俗话说人有千样性,书有千百脸,不同的人有不同的观点。那么接下来谈谈我的理解!!
首先spring当中是单例模式,当请求到tomcat时,tomcat创建一个线程去访问controller层。当N个用户操作时,tomcat创建N个线程去访问controller层,这个时候你上一个线程修改完这个bean后并没有结束,而是让出了cpu,下一个线程去访问。携带参数去修改数据,然后让出cpu。这个时候cpu又让给了第一个线程,继续往下走。
如下图:
这个时候问题来了,第一个线程拿到的值,还是第一个线程得到的值,还是线程二修改过的值?
没错是线程二的值,为什么呢?因为bean只有一份,每次访问的内存地址都是相同的,所以每次修改的对象也是相同的。也是并发安全的原因。
那么有什么解决办法那?
1.synchronized关键字修饰方法,或方法块
2.修改spring bean默认单例
3.ThreadLocal 副本操作。
内容隐藏了2个知识点,一个是tomcat创建线程,一个是声明bean。有兴趣的可以自己去看下或者等以后的叙述。
页面更新:2024-04-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号