problemas de controlador de alta concurrencia mvc primavera

SpringMVC controlador maneja todos los problemas de concurrencia una solicitud del usuario

Estatal y no estatal objeto conceptos básicos de
los objetos con estado (Stateful Bean), el objeto es tener una variable de instancia, puede guardar los datos, no apta para subprocesos. Generalmente prototipo alcance.
objeto Stateless (Stateless Bean), hay variables de instancia de un objeto, no puede guardar los datos, es la misma clase, son thread-safe. alcance general singleton.

Como en el Struts2 Acción, si el usuario de la instancia de variables interna, cuando un usuario llama al nuevo método, el usuario se usa para guardar los datos, entonces la acción es el estado del objeto. Que dará lugar a las variables de usuario inconsistentes cuando varios subprocesos tienen acceso a esta acción. Por lo tanto, el margen de acción diseñado para prototipo, o, clases de usuario a ThreadLocal en cadena aleatoria para mantener múltiples hilos no causa variables de usuario (tal escenario no es necesario poner en el ThreadLocal).

El servicio en general sólo las variables internas son como ejemplo DAO UserDAO, no tiene estado porque el objeto UserDAO (variables de instancia y no hay datos internos no pueden ser salvados), el objeto de servicio no tiene estado.

Para aquellas carreras de clase singleton en un multi-hilo

Las variables locales no se ven afectados por el impacto multihilo,
las variables miembro serán multi-hilo afectados.

El mismo método más de un subproceso llama a un mismo objeto: 
Si el método en el que no hay variables miembro, no se ven afectados;
si hay miembros del método variable, solamente las operaciones de lectura, no se ven afectados, hay una operación de escritura, tenga en cuenta el impacto del valor de múltiples hebras;

Tales como aplicaciones Web Servlet, cada método de funcionamiento de las variables locales se realiza en el hilo de su propia área de memoria, es seguro para subprocesos. 
Para las variables miembro operativo puede ser utilizado para garantizar la seguridad hilo ThreadLocal. 

SpringMVC en el controlador, el servicio, la capa general de alcance DAO son Singleton;

Cada solicitud es un hilo separado, incluso si el acceso simultáneo al mismo objeto Controlador porque el objeto no modifica el controlador, el equivalente a los efectos del objeto Controlador, que acaba de leer, no escribir, no es necesario sincronizar.

capa de servicio, capa Dao con el singleton por defecto en la línea, aunque la clase de servicio tiene como un DAO propiedad, pero Dao estas clases están sin información de estado, lo que equivale a la misma clase (inmutable), que no afecta.

Struts2 en acción porque hay usuario, BizEntity como instancia de un objeto, no hay información de estado en un entorno multi-hilo no es seguro, por lo que la aplicación por defecto struts2 modo de prototipo. En primavera, Struts2 de Acción de alcance que se desea copiar alcance prototipo.

cuestiones de seguridad hilo de acceso concurrente de primavera  

由于Spring MVC默认是Singleton的,所以会产生一个潜在的安全隐患。根本核心是instance变量保持状态的问题。这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:
一是我们不用每次创建Controller,
二是减少了对象创建和垃圾收集的时间;
由于只有一个Controller的instance,当多个线程同时调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。


有几种解决方法:
1、在控制器中不使用实例变量
2、将控制器的作用域从单例改为原型,即在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
3、在Controller中使用ThreadLocal变量

这几种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。
使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
所以在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的

 ThreadLocal和线程同步

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。

而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

缺点:threadlocal变量会一直存在于controller对象中,但是controller对象是多线程复用的,如果这一次请求完成之后忘记把threadlocal中的信息清空,则在处理下一个请求时则会出现信息串用。

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

 

https://blog.csdn.net/config441002/article/details/52084156

Supongo que te gusta

Origin www.cnblogs.com/suntp/p/9111844.html
Recomendado
Clasificación