您好,匿名用户

在servlet的doGet方法中,对某个单例的属性进行设值,会不会有线程安全问题

0 投票
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的??如果有,为什么?如何避免呢?
如果没有线程安全问题请说明原因,感激不尽。

用户头像 提问 2014年 3月2日 @ Nero 上士 (1,512 威望)
分享到:

1个回答

0 投票
 
最佳答案

肯定是有安全问题的,最简单的就是用sync代码段。
url属性既然是作为最小单元的资源那么没别的办法只能sync,这种情况大多数可以改造一下。

你的这个模型不是很好测试,因为最终结果是一样的,你可以试着改改
比如加入一个if-else分别执行m1和m2会更简单的测试

用断点调试的步骤,
1.在方法最后返回处设断点
2.第一次请求
3.取消断点
4.第二次请求
5.将第一次请求放行
这样的话第一次的结果会错误的拿到第二次的结果。

用户头像 回复 2014年 3月2日 @ Sion 中士 (1,154 威望)
选中 2013年 9月8日 @Nero
提一个问题:

相关问题

+3 投票
1 回复 180 阅读
用户头像 提问 2013年 8月11日 @ Quinn 下士 (907 威望)
0 投票
1 回复 38 阅读
0 投票
1 回复 47 阅读
0 投票
1 回复 13 阅读
0 投票
1 回复 69 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...