如何用SingleThreadModel解决多线程安全问题
2.用SingleThreadModel解决多线程安全问题:
前面介绍的都是普通的Servlet。对于每一个用户请求,那些Servlet都会用线程的方式给予应答。这样比较节省系统的资源。Sun公司也给出了另外一种方法,就是这节要介绍的SingleThreadModel的方法。当implement这个接口以后,你的Servlet就变成了另外一种模式工作。即,每一个新用户的请求,都会生成一个新的Servlet实例来应答。这种方法有两个方面的弊病。一是性能太差,最后会把机器拖累死。还有一条就是有时解决不了实际问题。每个servlet类实例都有自己独立的变量。如果我们的本意就是想让客户线程之间进行这些变量的交流。这种方法就无法做到。就像还有人建议的,用局部变量来代替类变量一样,有时也解决不了实际当中的算法问题。因为我们有时就需要用一个类似类变量一样的东西,来控制全局。即使这种方法这不好,那不好,现实中很多很多工程师也说不好。我还是给出了例子,让大家看看结果。
例:2.2.1
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ServletHello1 extends HttpServlet implements SingleThreadModel{
int bookNum=20;
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
while (bookNum>0){
onlySellOne(pw);
}
}
void onlySellOne(PrintWriter pw) throws IOException {
if (bookNum > 0) {
pw.println(Thread.currentThread().getName()
+ " before" + bookNum);
pw.flush();
bookNum--;
try {
Thread.sleep(2000);
} catch (Exception e) {
}
pw.println(Thread.currentThread().getName()
+ " after " + bookNum);
pw.flush();
}
}
}
- 点赞
- 收藏
- 分享
- 文章举报
- java多线程的等待唤醒机制及如何解决同步过程中的安全问题
- 黑马程序员-(多线程)了解线程与如何解决线程同步到来的安全问题!(面试)
- 如何解决企事业信息系统越来越多导致的帐号密码安全及管理混乱问题
- 多线程学习2,买火车票,并解决同步安全的问题
- 验证码短信安全问题如何解决
- 自己实现的STL(试图解决多线程的安全问题)
- 解决多线程下simpleDateFormat的安全问题
- IE11如何解决Oracle 11g EM网站报“此网站的安全证书存在问题” (一)
- 简单银行存款项目练习多线程安全问题解决方式——同步
- 新数据中心如何解决数据的灾备以及安全问题
- 多线程安全问题的解决方法一
- 用ThreadLocal解决多线程安全问题
- 如何解决PHP无法实现多线程的问题
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- Java学习笔记45(多线程二:安全问题以及解决原理)
- 如何解决公司网站首页被恶意跳转的安全问题
- 基础篇_线程 第4集 多线程的安全问题--解决之道同步代码块
- JDK1.5 中解决多线程安全问题的方法
- Win8如何解决打补丁后出现黑屏且无法进入安全模式的问题
- java 多线程(线程间通信-解决安全问题)