多线程的困惑


由于Spring的事务管理器是通过线程相关的ThreadLocal来保存数据访问基础设施,再结合IOC和AOP实现高级声明式事务的功能,

所以Spring的事务天然地和线程有着千丝万缕的联系。


我们知道Web容器本身是多线程的,Web容器为每一个http请求创建一个独立的线程。由此请求所涉及到的Spring容器中Bean 也是运行于多线程环境下,

在多数情况下,Spring中Bean都是单实例的。单实例Bean,优势;线程安全。


一个类能够以单实例状态运行的前提是“无状态”:即一个类不能拥有状态化的成员变量。我们知道,传统的编程中,Dao必须执行一个Connection,而Connection是状态的对象。

所以传统的Dao不能做成单实例的,每次要用时都必须new一个新实例。传统的Service由于将将有状态的Dao做为成员变量,所以传统的Service也是有状态的。


但是在Spring中,Dao和Service都是以单实例的方式存在。Spring是通过ThreadLocal将有状态的变量(如:Connection)本地线程化,达到另一个层面上的“线程无关”,

从而实现线程线程安全。Spring不遗余力的将状态化的对象无状态化,就是要达到单例化Bean的目的。


由于Spring已通过ThreadLocal的设施将Bean无状态化,所以,Spring中单例Bean对线程有天生的免疫力。不但单实例的Service可以运行于多线程环境,

Service本身可以启动独立线程以执行其他Service,



结论,在相同的线程中相互嵌套调用的事务方法工作的相同的事务环境中,

如果这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。


你可能感兴趣的:(多线程的困惑)