
Spring成为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但似乎,Spring并没有确保那些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。

Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。



我们了解在通常状况下,只有无状态的Bean才可以在多线程环境下共享spring 多线程,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理spring 多线程,让他们也作为线程安全的状况,因为有状态的Bean就可以在多线程中共享了。

一般的Web应用划分为展示层、服务层跟持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向下层开放功能调用。在通常状况下,从接收请求至返回响应所经过的所有程序调用都同属于一个线程。
ThreadLocal是解决线程安全问题一个很好的模式,ThreadLocal是一个为泛型提供线程局部变量的工具类。它的观念也非常简洁,就是为泛型提供一个线程私有的数组副本,这样多个线程都可以轻易修改自己线程局部的数组,不会影响到其它线程。不过必须注意的是,ThreadLocal提供的也是一个浅拷贝,如果函数是一个引用类别,那么就该考虑它外部的状况能否会被改变,想要解决这个难题可以借助重写ThreadLocal的initialValue()函数来自己实现深拷贝,建议在使用ThreadLocal时一开始就重写该函数。
ThreadLocal通过为每位线程提供一个独立的函数副本解决了数组并发访问的矛盾问题。在这些状况下,ThreadLocal比直接使用synchronized同步模式解决线程安全问题很简洁,更方便,且结果程序拥有更高的并发性。
如果你的代码所在的进程中有多个线程在同时运行,而这种线程可能会同时运行这段代码。如果每天运行结果跟单线程运行的结果是一样的,而且其它的变量的值也跟预期的是一样的,就是线程安全的。
或者说:一个类以及程序所提供的接口对于线程来说是原子操作以及多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的疑问。 返回搜狐,查看更多
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-136270-1.html
君子一言
去不了