Spring中Singletons的线程安全
Thread-safe在Java Concurrency in Practice这本书里面的定义是:
A class is thread-safe if it behaves correctly when accessed from multiple threads, regardless of the scheduling or interleaving of the execution of those threads by the runtime environment, and with no additional synchronization or other coordination on the part of the calling code.
Spring本人不是很熟悉,网上Google了下相关方面的话题,得到的有用的结果很少。可以参考的是:[Thread safety, singletons and Spring。][1]还有一篇是:[Thread-safe webapps using Spring][2]。
基本上,Spring的thread-safe是其API自身的thread-safe。比如一个常见的场景(from appfuse):
public class UserManagerImpl extends BaseManager implements UserManager {
private UserDao dao;
……
public class UserDaoHibernate extends BaseDaoHibernate implements UserDao, UserDetailsService {
……
public class BaseDaoHibernate extends HibernateDaoSupport implements Dao {
这些bean都是Singletons的。
一个类如果没有成员变量,那这个类肯定是thread-safe的,所以UserDaoHibernate的thread-safe取决于其父类。而 UserManagerImpl 的安全性又取决于UserDaoHibernate,最后是HibernateTemplate。可以看出,这里的bean都小心翼翼的维护其成员变量,或者基本没有成员变量,而将thread-safe转嫁给Spring的API。如果开发者按照约定的或者用自动产生的工具(appgen不错)来编写数据访问层,是没有线程安全性的问题的。Spring本身不提供这方面的保证。
或者bean的定义为Singletons=”false”,也可以参考前面的一篇文章[Thread safety, singletons and Spring][1],用lookup-method。