ejb中无状态bean不是单例,而是一系列,多个,存在于ejb池中,很郁闷,ssh中的业务都是单例
ejb中无状态bean不是单例,而是一系列,多个,存在于ejb池中,很郁闷,ssh中的业务都是单例,是否无法并发?可以并发,但是是如何解决线程安全的?通过threadlo...
ejb中无状态bean不是单例,而是一系列,多个,存在于ejb池中,很郁闷,ssh中的业务都是单例,是否无法并发?
可以并发,但是 是 如何解决线程安全的? 通过threadlocal吗? 业务bean dao 需要用threadlocal吗? 展开
可以并发,但是 是 如何解决线程安全的? 通过threadlocal吗? 业务bean dao 需要用threadlocal吗? 展开
1个回答
展开全部
是否并发仅跟状态值存储在什么地方,传递过程中是否有缓存。
EJB 中的无状态 bean 为什么能并发,因为它自己本身不保存状态,你会把你的数据保存在无状态bean 成员变量中么?那只有有状态 bean 才会这么做。这就是所谓状态。并发和线程安全的根本是大家不能出现状态冲突,我们在处理请求时不同请求不能把各自该处理的数据状态值搞混了。
ThreadLocal 为什么能解决并发问题呢?就因为它的状态值是只跟当前线程关联,不同的线程之间并不会共享状态。所以不要只关注“并发和线程安全”这两个词汇,而是应该关注“状态”保存在什么地方,处理过程中是否有与其它线程共享的可能,我们需要有方法隔离状态。
Servlet 本身是线程安全的,因为它自己把所有当前请求的东西都保存在这个 request 对象中,如果我们把状态保存在 session 中时同一个用户的浏览器打开两个窗口同时提交请求就出现了线程安全问题。Request 这个对象就是它们的状态值。
Servlet 是单例的,但状态值在 request 中就以做到线程安全(只要我们不把它保存到 session 中去),所以这跟是否单例其实没有关系,只是当我们把状态值保存在这个类中时单例和非单例才有区别。
EJB 中的无状态 bean 为什么能并发,因为它自己本身不保存状态,你会把你的数据保存在无状态bean 成员变量中么?那只有有状态 bean 才会这么做。这就是所谓状态。并发和线程安全的根本是大家不能出现状态冲突,我们在处理请求时不同请求不能把各自该处理的数据状态值搞混了。
ThreadLocal 为什么能解决并发问题呢?就因为它的状态值是只跟当前线程关联,不同的线程之间并不会共享状态。所以不要只关注“并发和线程安全”这两个词汇,而是应该关注“状态”保存在什么地方,处理过程中是否有与其它线程共享的可能,我们需要有方法隔离状态。
Servlet 本身是线程安全的,因为它自己把所有当前请求的东西都保存在这个 request 对象中,如果我们把状态保存在 session 中时同一个用户的浏览器打开两个窗口同时提交请求就出现了线程安全问题。Request 这个对象就是它们的状态值。
Servlet 是单例的,但状态值在 request 中就以做到线程安全(只要我们不把它保存到 session 中去),所以这跟是否单例其实没有关系,只是当我们把状态值保存在这个类中时单例和非单例才有区别。
更多追问追答
追问
嗯,先这么理解,状态是被共享数据成员。。调用过程中传递的参数应该是线程独立的吧。ssh里确实都是无状态的bean设计,只有最后那个session 是有状态的吧。
没状态的对象就没必要用threadlocal,并发起来照样线程安全,谢谢点醒。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询