如何用SingleThreadModel解決多線程安全問題

用SingleThreadModel解決多線程安全問題:
馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
前面介紹的都是普通的Servlet。對于每一個用戶請求,那些Servlet都會用線程的方式給予應答。這樣比較節(jié)省系統(tǒng)的資源。Sun公司也給出了另外一種方法,就是這節(jié)要介紹的SingleThreadModel的方法。當implement這個接口以后,你的Servlet就變成了另外一種模式工作。即,每一個新用戶的請求,都會生成一個新的Servlet實例來應答。這種方法有兩個方面的弊病。一是性能太差,最后會把機器拖累死。還有一條就是有時解決不了實際問題。每個servlet類實例都有自己獨立的變量。如果我們的本意就是想讓客戶線程之間進行這些變量的交流。這種方法就無法做到。就像還有人建議的,用局部變量來代替類變量一樣,有時也解決不了實際當中的算法問題。因為我們有時就需要用一個類似類變量一樣的東西,來控制全局。即使這種方法這不好,那不好,現(xiàn)實中很多很多工程師也說不好。我還是給出了例子,讓大家看看結(jié)果。

例: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();
        }
    }
}

內(nèi)置瀏覽器的輸出結(jié)果是:

http-8080-Processor22 before20 http-8080-Processor22 after 19 http-8080-Processor22 before19 http-8080-Processor22 after 18 http-8080-Processor22 before18 http-8080-Processor22 after 17 http-8080-Processor22 before17 http-8080-Processor22 after 16 http-8080-Processor22 before16 http-8080-Processor22 after 15 http-8080-Processor22 before15 http-8080-Processor22 after 14 http-8080-Processor22 before14 http-8080-Processor22 after 13 http-8080-Processor22 before13 http-8080-Processor22 after 12 http-8080-Processor22 before12 http-8080-Processor22 after 11 http-8080-Processor22 before11 http-8080-Processor22 after 10 http-8080-Processor22 before10 http-8080-Processor22 after 9 http-8080-Processor22 before9 http-8080-Processor22 after 8 http-8080-Processor22 before8 http-8080-Processor22 after 7 http-8080-Processor22 before7 http-8080-Processor22 after 6 http-8080-Processor22 before6 http-8080-Processor22 after 5 http-8080-Processor22 before5 http-8080-Processor22 after 4 http-8080-Processor22 before4 http-8080-Processor22 after 3 http-8080-Processor22 before3 http-8080-Processor22 after 2 http-8080-Processor22 before2 http-8080-Processor22 after 1 http-8080-Processor22 before1 http-8080-Processor22 after 0




火狐瀏覽器的輸出結(jié)果是:
http-8080-Processor24 before20
http-8080-Processor24 after 19
http-8080-Processor24 before19
http-8080-Processor24 after 18
http-8080-Processor24 before18
http-8080-Processor24 after 17
http-8080-Processor24 before17
http-8080-Processor24 after 16
http-8080-Processor24 before16
http-8080-Processor24 after 15
http-8080-Processor24 before15
http-8080-Processor24 after 14
http-8080-Processor24 before14
http-8080-Processor24 after 13
http-8080-Processor24 before13
http-8080-Processor24 after 12
http-8080-Processor24 before12
http-8080-Processor24 after 11
http-8080-Processor24 before11
http-8080-Processor24 after 10
http-8080-Processor24 before10
http-8080-Processor24 after 9
http-8080-Processor24 before9
http-8080-Processor24 after 8
http-8080-Processor24 before8
http-8080-Processor24 after 7
http-8080-Processor24 before7
http-8080-Processor24 after 6
http-8080-Processor24 before6
http-8080-Processor24 after 5
http-8080-Processor24 before5
http-8080-Processor24 after 4
http-8080-Processor24 before4
http-8080-Processor24 after 3
http-8080-Processor24 before3
http-8080-Processor24 after 2
http-8080-Processor24 before2
http-8080-Processor24 after 1
http-8080-Processor24 before1
http-8080-Processor24 after 0

盡管上面兩個瀏覽器同時訪問,兩個瀏覽器輸出的結(jié)果也都是正確的,但也沒有用,因為這不是用戶需求要求我們的。用戶需求要求我們說,總共就24本書,兩個人一起賣。而現(xiàn)在這樣成了,兩個人加起來,一共48本書了。