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创建。
所以,既然两个都不同,当然不会被替换。