Java web请求即线程

 

读前说明

在写之前理清下思维:

关于Spring Controller

springMVC 项目 controller默认是单例; 按一个请求等于一个线程想法, 为避免线程间数据共享,因此controller 需要的数据都从方法参数传递,安全;

如果是多例,则采用这种方式@scope

 
@Controller
@Scope("prototype")
@RequestMapping("/test")
public class TestController{
  ......
}

 

Spring MVC的Controller用的是Servlet的思想,单例性能好,但线程不安全,如果用其它的Scope,性能会下降。
建议用默认单例方式,实现要共享对象属性,可以用ThreadLocal保护

 

关于单例: 

主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection) 

 

javaWeb线程

参考文章:  http://blog.csdn.net/wtopps/article/details/71339295 

在开发中,突然想到了这样的一个问题, Java对每一次Web的请求,是否都会创建一条线程去进行处理呢?也就是说,当一个Class的方法同时有1000个请求访问时,线程是如何运作的呢?

解释上面的问题,首先需要说一下Web服务器处理请求的几种模式:

1、单线程请求模式

收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。一般的服务器不会使用这种方式实现。

2、相对非阻塞模式

收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。 
首先纠正一个错误,这并不是非阻塞,它也是阻塞的。相对第一个模型来说,它解决了主线程阻塞的问题,有了一定程度的并发量,但是在每个新开的线程中还是阻塞的。如果100个人同时访问,将会开100个线程,那1000个人,10000个人呢?频繁开关线程很消耗资源,这样实现的服务器性能依然不高。

3、线程池模式

类似2的模型,但是不是每次收到请求就开一个新的线程,而是使用线程池。 
如果不了解线程池,你可能会了解数据库连接池,由于频繁创建、关闭数据库连接会消耗资源,所以会用数据库连接池来保存一定数量的连接,如果需要就从连接池里取连接,不需要则放回连接池,不在频繁创建。线程池也是一样的道理,线程池管理多线程,性能比频繁创建线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。

4、基于Java NIO实现的服务器模型 

上面说到的几种模型,都是基于BIO(阻塞IO)。而NIO则是非阻塞IO,它是基于IO多路复用技术(例如Reactor模式)实现,只需要一个线程或者少量线程,就可以处理大量请求。从性能上来说NIO实现的服务器并发性一般大于BIO,所以可以实现高性能的服务器。如果感兴趣,可以学习一些基于NIO的网络编程框架,例如Netty、MINA。

而我们最常见的Tomcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>
  •  

从性能上考虑建议使用NIO。

总结

在实际开发中,如果是要求实时响应性比较高的系统,或者采用了类似Dubbo这种SOA微服务分布式的系统,一次请求的响应时间需要进行控制,这种情况下,如果代码执行到可能发生阻塞操作的地方(例如:查询数据量比较大的表、循环多次操作Redis Cache等),往往就可能出现服务超时的问题(Timeout Exception),对于这种情况,可以考虑采用线程池解决这个问题。

采用线程池的话,将线程池定义为全局静态对象,在方法中使用,可以将可预见的会发生阻塞操作的代码块部分放入线程池进行执行,如此这样,当主线程执行到线程池的部分,会执行线程池的run()方法,然后主线程会继续向下执行,直到最后直接返回结果,而阻塞的部分将在run()方法中执行,不会阻塞主线程的执行,这样可以达到一个异步非阻塞的快速响应。  

 

 

 

转载于:https://my.oschina.net/java1314/blog/915560

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值