关于servlet的线程安全问题

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

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

条件1:多线程并发

条件2:有共享数据

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

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

  - 栈内存:

方法调用的时候,该方法所需要的内存在栈中分配,此时发生压栈动作,方法结束的时候,给该方法在栈中分配的内存释放,此时发生弹栈动作

一个方法的代码片段可以对应多个不同的内存空间。

一个线程会对应一个独立的栈空间【100个线程有100个栈】

栈中主要存储局部变量,局部变量的内存永远都不会多线程共享,所以局部变量不会存在线程安全问题。

- 堆内存:

JVM堆内存空间只有一个,所以JVM堆内存在多线程环境下是共享的。

new出来的对象在堆中存储。实例变量在对象内部。

所以实例变量可能在多线程环境下共享,可能存在线程安全问题。

- 方法区内存:

JVM方法区内存只有一个,也是多线程共享的。

在方法区中存在静态变量,所以静态变量可能会存在线程安全问题。

4Servlet是单例的,Servlet对象只有一个,多线程共享,所以Servlet中若存在静态变量和实例变量,都可能存在线程安全问题,

但是ServletdoGet/doPost方法内部的局部变量不会存在线程安全问题。

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

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

选择2:将单例改为多例

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值