前言:最近在学习《Java并发编程实战》 感觉是有一定的难度。正在努力的理解如何编写多线程安全的程序。
发现线程不安全的核心:对共享数据的修改
这就联想到了 Java web ,web 所在的环境就是高并发的,那么如何在高并发的环境下保证自己的web 项目是安全的???
一:web服务器 接收请求时的线程情况
web 服务器处理请求的几种模式:
- 收到一个请求就处理,此时不能处理其他的请求,直到这个请求处理完成,这是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,无法处理下一个请求。一般不采用这种方式
- 收到一个新的请求就开一个线程去处理,这样的方式看似非阻塞,但是实际上也是阻塞的。相对于1模式来说他是有一定的并发量,但是频繁的开线程也十分的消耗资源
- 类似2的模型,但是不是每次收到请求就开一个新的线程,而是使用线程池。
如果不了解线程池,你可能会了解数据库连接池,由于频繁创建、关闭数据库连接会消耗资源,所以会用数据库连接池来保存一定数量的连接,如果需要就从连接池里取连接,不需要则放回连接池,不在频繁创建。线程池也是一样的道理,线程池管理多线程,性能比频繁创建线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。 - 基于Java NIO实现的服务器模型
上面说到的几种模型ÿ