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出来的对象在堆中存储。实例变量在对象内部。 所以实例变量可能在多线程环境下共享,可能存在线程安全问题。
- 方法区内存: JVM方法区内存只有一个,也是多线程共享的。 在方法区中存在静态变量,所以静态变量可能会存在线程安全问题。
4、Servlet是单例的,Servlet对象只有一个,多线程共享,所以Servlet中若存在静态变量和实例变量,都可能存在线程安全问题, 但是Servlet的doGet/doPost方法内部的局部变量不会存在线程安全问题。
5、怎么解决线程安全问题?
选择1:尽量使用局部变量
选择2:将单例改为多例
选择3:若必须使用单例,可以使用线程同步机制synchronized
注意:线程同步机制是最后的选择,这种方式会让吞吐量降低,影响客户的体验
————————————————
版权声明:本文为CSDN博主「20508LAlala」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zx_balabala/article/details/82817441