首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用SingleThreadModel解决多线程安全问题

如何用SingleThreadModel解决多线程安全问题

作者头像
马克java社区
修改于 2021-07-08 14:31:15
修改于 2021-07-08 14:31:15
6030
举报
文章被收录于专栏:java大数据java大数据

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();

}

}

}

更多请看:https://blog.csdn.net/qq_44594371/article/details/103163760

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档