Struts2中action生命周期和Servlet生命周期

action生命周期
        每次请求到来时,都会创建一个新的Action实例
        action是线程安全,可以使用成员变量接收参数。

Servlet生命周期分为三个阶段: 
            1:初始化阶段,调用init()方法 
            2:响应客户请求阶段,调用service()方法 
            3:终止阶段,调用destory()方法
        servlet存在线程安全问题:

1、Servlet对象是一个单实例的对象,并且在多线程的环境下运行,所以Servlet对象存在线程安全问题。

2、什么情况下会存在线程安全问题?

条件1:多线程并发

条件2:有共享数据

条件3:共享数据涉及到修改操作

3、JVM包括三块主要的内存空间:栈内存、堆内存、方法区内存  

 - 栈内存: 方法调用的时候,该方法所需要的内存在栈中分配,此时发生压栈动作,方法结束的时候,给该方法在栈中分配的内存释放,此时发生弹栈动作 一个方法的代码片段可以对应多个不同的内存空间。 一个线程会对应一个独立的栈空间【100个线程有100个栈】 栈中主要存储局部变量,局部变量的内存永远都不会多线程共享,所以局部变量不会存在线程安全问题。

- 堆内存: JVM堆内存空间只有一个,所以JVM堆内存在多线程环境下是共享的。 new出来的对象在堆中存储。实例变量在对象内部。 所以实例变量可能在多线程环境下共享,可能存在线程安全问题。

扫描二维码关注公众号,回复: 3341578 查看本文章

- 方法区内存: JVM方法区内存只有一个,也是多线程共享的。 在方法区中存在静态变量,所以静态变量可能会存在线程安全问题。

4、Servlet是单例的,Servlet对象只有一个,多线程共享,所以Servlet中若存在静态变量和实例变量,都可能存在线程安全问题, 但是Servlet的doGet/doPost方法内部的局部变量不会存在线程安全问题。

5、怎么解决线程安全问题?

选择1:尽量使用局部变量

选择2:将单例改为多例

选择3:若必须使用单例,可以使用线程同步机制synchronized

注意:线程同步机制是最后的选择,这种方式会让吞吐量降低,影响客户的体验

猜你喜欢

转载自blog.csdn.net/zx_balabala/article/details/82817441
今日推荐