首页 新闻 搜索 专区 学院

关于web中spring bean的问题?

0
悬赏园豆:10 [已解决问题] 解决于 2020-04-30 10:28

学了这么久的web,确实对很多方面不是很懂。例如我知道spring中bean是单例,同时也知道这不是线程安全的,并且也知道如何保证线程安全,用ThreadLocal这种机制,同时看网上说无状态Bean是线程安全的类似Dao层,Controller层,有状态就是线程不安全了?
疑问就是比如多个用户同时发送一个查询或者修改的数据(如账号数据,是一个类),但是如果bean是单例的话,岂不是数据会不正常?不是很明白这里面的原理,有么有大佬解释一下。

dark_Souls的主页 dark_Souls | 初学一级 | 园豆:124
提问于:2020-04-30 02:05
< >
分享
最佳答案
0

首先,spring的bean不一定是单例的,作用于有singleton、prototype、request好多种;
线程安全不一定是使用ThreadLocal,ThreadLocal只是一种方式;
无状态的bean,这个无状态,可以和http的无状态类比一下;有状态的话,就是有上下文(context)

收获园豆:10
寻觅beyond | 小虾三级 |园豆:554 | 2020-04-30 10:11

前面说的那些我知道,我最想知道是后面那个问题

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:12

多个用户同时登陆,查询数据,从数据库返回的是同一个类,那么默认单例的话,岂不是会出现错误,但是这一定没有错误,因为事实确实都是能登上,这是如何实现这种隔离的呢?至于上下文是指IOC容器中的高级容器吗?有状态无状态确实不太懂,我会下去查查看。

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:16

@dark_Souls: 每一次请求对应一个线程,每个线程中的数据有自己的作用域,像你说的那种数据库操作,都是在一个方法中的操作,不是共享的,为什么会有安全问题?

寻觅beyond | 园豆:554 (小虾三级) | 2020-04-30 10:27

bean是单例,并发访问并没有“修改bean属性”得操作,都是操作得局部变量。这个是线程安全的。至于你说得,“ 多个用户同时发送一个查询或者修改的数据(如账号数据,是一个类) ”. 这种数据一致性,需要通过各种锁。数据库得悲观锁,或者CAS锁来完成。
别的论坛搞到得答案

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:27

@寻觅beyond: 这下搞清了,谢谢你蛤

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:28

最后问个问题,方法得局部变量,例如controll方法中得变量,是从IOC容器中取吗?还是说用的栈区?

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:30

@dark_Souls: 方法中的局部变量,一般都是在方法栈区中,如果局部变量的数据比较大,比如一个字符串有几百兆,就可能存放到堆中。

寻觅beyond | 园豆:554 (小虾三级) | 2020-04-30 10:35

@寻觅beyond: 明白了,明白了,以前一直以为spring中承包了,程序中所有的对象创建,取用,现在一想,自动装配一般用在service这些类中对象,我以为方法中依赖注入的对象也是从ioc容器中取得。没办法自己悟性差了。谢谢您了。

dark_Souls | 园豆:124 (初学一级) | 2020-04-30 10:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册