SpringMVC是如何处置线程安全

线程安全

一般情况下,@Controller是单例的,和Servlet那时是一样的,参见我的Servlet的第二章处理线程安全的问题。


例5.1:

package com;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.ServletConfigAware;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.support.RequestContextUtils;

import com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

@Controller
public class HelloWorldController implements ServletConfigAware,ServletContextAware {
    private ServletContext servletContext;
    @Override
    public void setServletContext(ServletContext arg0) {
        this.servletContext = arg0;
    }
    private ServletConfig servletConfig;
    @Override
    public void setServletConfig(ServletConfig arg0) {
        this.servletConfig = arg0;
    }
    int bookNum=20;
    @RequestMapping("/MultiThread.do")
    public void downloadF(HttpServletRequest request, HttpServletResponse response,
            HttpSession sesssion)  throws IOException, ServletException {
        PrintWriter pw = response.getWriter();
        while (bookNum>0){
            onlySellOne(pw);
        }
    }
    synchronized 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();
        }
    }
}