servlet 如何处理多请求访问以及线程讲解
servlet 如何处理多请求访问以及线程讲解
场景:js循环500次请求同一个后台接口,接口内部逻辑:1、查询商品数量,2、扣减商品数量 ,那么该接口是否需要考虑多线程并发安全问题?
分析:
1、先了解tomcat容器处理多个请求的过程,详见 https://www.cnblogs.com/GtShare/p/8033637.html 说明多个请求访问同一个接口会是多线程行为,那么接口内部的共享数据会存在数据被共同访问的情况,存在安全性。
2、解决多线程数据共享访问的安全性
分多种情况: 1)静态方法。这种情况不会有线程安全问题 2)加锁的非静态方法。这种情况也不会 3)未加锁且操作共享数据的非静态方法,这种情况会有线程安全问题
Tomcat 7 的 Connector 分为两种模式,NIO (非阻塞)和 BIO (阻塞)。其中 NIO 用固定数目线程接受全部连接请求,Web 应用程序用 Java NIO API 来处理。BIO 则对每个请求在一个单独的线程池上获取线程来处理。 NIO 本身占用线程较少,代价是应用开发者需要用 Buffer 处理。应用开发者需要管理 Buffer 和保护它们。提供的并行性能力较强。 BIO 提供阻塞流,应用开发比较容易。每个请求在单独线程中,应用开发者需要保护自己的共用数据结构(一般用 Lock 或 Synchronize)。它提供的并行性能力较弱。