Servlet para download. Erro ao fazer downloads simultâneos

Servlets são Multi-thread por default !?
Porque ocorre erro quando estou fazendo downloads simultaneos ?

Código do servlet

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println("Servlet Download ");
        HttpSession session = request.getSession();
        Arquivo arquivo = (Arquivo) session.getAttribute("Arquivo");
        session.removeAttribute("Arquivo");

        response.setHeader("Content-Disposition", "attachment;filename=\"" + arquivo.getFile().getName() + "\"");
        response.setContentLength((int) arquivo.getFile().length());
        ServletContext context = super.getServletContext();
        response.setContentType(context.getMimeType(arquivo.getFile().getName()));
        System.out.println("Mimetype " + context.getMimeType(arquivo.getFile().getName()));
        try {
            FileInputStream input = new FileInputStream(arquivo.getFile());
            ServletOutputStream out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int i;
            while ((i = input.read(buffer)) != -1) {
                out.write(buffer, 0, i);
            }
            out.flush();
            input.close();
            out.close();
        } catch (IOException err) {
            err.printStackTrace();
        }

}

Não encontro por ai material sobre o assunto.

Qual o erro lançado?

Essa linha :

Funciona? O tipo MIME é ajustado por outros parâmetros, não pelo nome do arquivo (por exemplo, arquivos PDF têm tipo MIME application/pdf ).

[]´s

Não da erro de compilação. O erro é na hora de iniciar o segundo download. O primeiro download tem o tamanho alterado o que zica o arquivo baixado ! Alterou o tamanho, adeus arquivo !

Notei que funciona sim, mas sem setar o tipo mime também funciona. Não notei diferença.
Quando abre o download ele ja associa um programa ao tipo mime do arquivo.

Eu nao quero colocar synchronized no metodo. Quero os downloads acontecendo simultaneamente !
Li sobre servlets no livro do Deitel e nas apostilas da Globalcode e Caelum e está dizendo que servlets são multi-thread por default(me corrija se eu estiver errado!). Fica a cargo do container se um servlet gera uma nova thread ou uma nova instância.
Não entendo porque acontece o erro.

Ninguem galera ?!!

Depois de procurar muito encontrei o problema e espero que sirva para outros que passem por ele.

response.setContentLength((int)arquivo.getFile().length());

Esse método setContentLenght recebe um int. O arquivo que estava para download superava o tamanho de um int.
Isso foi resolvido adicionando ao header suporte a arquivos maiores que um int.

response.addHeader("Content-Length", Long.toString(arquivo.getFile().length()));

Agora ele não altera o tamanho do arquivo.

Té mais galera