-
线程安全
- 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
- For Example:
在两个线程运行的时候,同时去读取A变量,如果线程1对变量A进行操作的时候没有进行加锁,线程2也会同时对A变量进行操作,可能会产生以下结果。
如果A=3, 线程1 读取到3 ,执行+1操作,线程2读取到3,执行-1 操作,线程1 写回4,线程2 写回2,最后的结果为2 很明显结果有误,也就是线程不安全了。
-
SpringMVC 的Controller
- Spring的Controller是单例运行的,优点在于,不需要每次创建Controller,每次运行的时候可以直接调用;减少了对象创建和垃圾回收的时间,也不需要进行频繁的垃圾回收了。
- 缺点就是,在单例模式下运行没有任何问题,但是如果多线程下运行,Controller中的变量会被其他线程修改,造成线程不安全
- 在Controller中使用ThreadLocal变量
- 在spring配置文件Controller中声明 scope=”prototype”,每次都创建新的controller
- 默认Controller、Dao、Service都是单例的。
-
Struts中的action
- spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
- spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通过setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。
- Struts2是线程安全的