doGet(){
SomeSingelton.methodOne("url one");
SomeSingelton.methodTwo("url two");
}
//单例实现省略
public class SomeSingelton {
private String url;
public static void methodOne(String url){
setUrl(url);
//http get url
}
public static void methodTwo(String url){
setUrl(url);
//http get url
}
}会不会有线程A设置了url one,正准备执行http get的时候,线程B设置成了url two。导致url one的返回值是url two的??如果有,为什么?如何避免呢?如果没有线程安全问题请说明原因,感激不尽。
2 回答
墨色风雨
TA贡献1853条经验 获得超6个赞
有问题,servlet不是线程安全的,多个线程同时读写url这个成员变量时就会出问题。
解决办法有几种:
最好重构这个类,不要有可写的成员变量。例如变成methodOne和methodTwo这些方法的局部变量。
也可以不使用单例,而是在doGet里面每次新建一个对象。
不太好的方案是使用synchronized关键字,但使用不当有可能会带来严重的性能问题。
添加回答
举报
0/150
提交
取消