1.Spring的并发问题——有状态Bean和无状态Bean有状态Bean1.Spring的并发问题——有状态Bean和无状态Bean
一、有状态和无状态
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
简单来说,有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。
由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
简单来说,无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。
2.Bean是线程安全的吗?
prototype: 线程安全
singleton: 无状态下:线程安全; 有状态下:线程不安全
3.解决Bean线程不安全问题?
ThreadLocal
对象---具体看并发多线程内容
ThreadLocal 是一个类,和线程有关,但并不是一个Thread
这个类能够提供线程局部变量
threadLocals的实际类型是ThreadLocal.ThreadLocalMap
当然,他和普通的变量有所不同。它本身是唯一的对象,你可以把它new出来,但每个线程去访问或者设置它的时候,读取和设置的并不是这个对象,而是本线程内这个对象的副本。
这也意味着,这个对象在不同的线程中,副本的值是不一样的