controller默认是单例模式,所有线程使用同一个对象,当controller类中没有定义类变量,或存在常量时,是线程安全的。
使用单例模式的优点:
提高访问速度,单例只有一个对象,不用每次都new
当不在controller中定义类变量时,单例是完全够用的。
存在类变量不是线程安全的原因
当定义一个类变量s时,在此时他是所有线程所共享的变量,线程a对其进行了修改,线程b对其操作时,会直接获得到线程a修改后的变量s,这样s在线程间重复修改,不是安全状态。
解决非线程安全
1.可以在controller类上添加注释@Scope(“prototype”);将其改为多例模式。
2.对类变量进行ThreadLocal(线程本地存储处理)。。。不实际。
servlet的单实例多线程模型。
servlet只有在启动时调用一次init()方法,只是初始化了一次,产生了一个实例对象。所以其是单例模式。其优点与controller差不多
ps:spring对每一个request(对应controller中的方法)都进行了ThreadLocal处理,使得每个请求都是独立的线程,保证线程安全。
关于ThreadLocal
看这个:http://blog.csdn.net/wangpei555/article/details/61418132
具体源码待补。。