多线程问题

public synchronized String test(String xml) throws Exception {
        String xmlSign = null;
        String url = "http://" + config.getAddress() + ":" + config.gePort();
        PostMethod post = new PostMethod(url);
        post.setRequestBody(xml);
        post.setRequestHeader("Content-Length","");
        post.setRequestHeader(" Content-Type", "");

        HttpClient client = new HttpClient();
        client.getHttpConnectionManager().getParams().setSoTimeout(300000);

        int result;
        try {
            result = client.executeMethod(post);
            // 返回200为成功
            String repContent = post.getResponseBodyAsString();
            if (repContent == null || "".equals(repContent)) {
                post.releaseConnection();
                throw new Exception("签名返回错误:" + repContent);
            }
            repContent.replaceAll("\n", "");
            if (200 == result) {
                int beginSign = repContent.indexOf("<a>") + 6;
                int endSign = repContent.indexOf("</a>");
                xmlSign = repContent.substring(beginSign, endSign);
            } else {
                post.releaseConnection();
                throw new Exception("连接码为:" + repContent);
            }

            // 返回的内容
            post.releaseConnection(); // 释放连接
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
        }
        return xmlSign;
    }

 最近做某系统,需要进行数据签名,因此实现了签名方法;但是方法写好了,出现了线程问题没办法把方法体设为同步的。因为HTTP的连接可能不稳定,所以当多个线程到这里时候就好出现等待,假如10个线程同时到达,对后一个线程访问的时候可能会等待50分钟,这样就得不偿失了。怎么解决这种问题。

 

[quote]
奥,我多线程了解太差。现在想问一个线程进入方法中XML的值为A,第二个线程进入方法是XML的值是B。但线程1还没执行到 post.setRequestBody(xml); XML会不会出现被替换。
[/quote]
方法内部的局部变量都是线程安全的。这里的参数xml也是,一方面方法是传值的,传的就是对xml内容的一个引用,另一个方面,String本身是不可变类,对象内容是不可变的,如果变了,那就不是同一个对象了,xml的引用也不同。

这个方法为什么要加synchronized ?
需要对那些资源进行互斥?

Apache的HttpClient是线程安全的。
这里看不出哪里是不安全的。

[quote]奥,我多线程了解太差。现在想问一个线程进入方法中XML的值为A,第二个线程进入方法是XML的值是B。但线程1还没执行到 post.setRequestBody(xml); XML会不会出现被替换。 [/quote]
这个是不会的

两个线程的xml是不同的,因为传了不同的参数。
两个线程的post也是不同的,因为每次用new创建。
所以,既然两个都不同,当然不会被替换。