web开发中的线程问题

1)线程安全问题
 很多做web开发的同学对线程安全的问题根本提不起兴趣,原因是根本用不到,也不用考虑,只是在换工作面试的时候,会去看看。日常我们使用mvc框架进行web项目开发,如spring mvc struts,可以看到基于http的web开发本身就是多线程问题,只不过Tomcat或者spring mvc已经帮你处理好了,你需要在里面写业务就行了。
 Tomcat线程模型分为bio、nio、apr三种类型,bio中会建立一个线程池,一个请求到来的时候,取出一个线程处理请求。NIO为一个基于缓冲区、并能提供非阻塞I/O操作,不要为每个请求建立一个线程,可以实现线程的复用(暂时这么理解)。第三种不做讨论。
 servlet是线程不安全的,servlet实例是单例的,以便实现复用,节省内存。spring mvc使用servlet拦截请求,这是单例的。
以上问题你都不用考虑,spring、tomcat已经帮你处理好了,需要注意的是spring mvc各个组件controller、service、dao默认都是单例的,所以web开发中是会出现线程安全问题的,但一般可以使用ThreadLocal和不使用属性变量解决。
 TheadLocal对于线程整个生命周期是线程安全的,你可以向里面存数据,且这个数据不会被其他线程修改。spring中对事务的管理就是通过ThreadLocal实现的。具体可以看这篇博文。https://www.cnblogs.com/fishisnow/p/6396989.html。尽量不用使用类属性变量,因为JVM堆区域是不同线程共享的,而栈内存不同线程是隔离的。如果非要使用,一定要使用线程安全的问题,如使用线程安全的集合和map,否则可能会出现线程安全问题。
2)使用线程
 web开发中很少使用线程来提高并发速度,原因是业务比较简单,大部分都是crud,性能瓶颈往往不在应用,而在于数据库,解决问题的核心还是依赖于SQL的优化。

你可能感兴趣的:(web开发中的线程问题)