开发者社区> 问答> 正文

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

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的??如果有,为什么?如何避免呢?
如果没有线程安全问题请说明原因.

展开
收起
蛮大人123 2016-03-05 00:02:39 2386 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    定是有安全问题的,最简单的就是用sync代码段。
    url属性既然是作为最小单元的资源那么没别的办法只能sync,这种情况大多数可以改造一下。
    你的这个模型不是很好测试,因为最终结果是一样的,你可以试着改改
    比如加入一个if-else分别执行m1和m2会更简单的测试
    用断点调试的步骤,
    1.在方法最后返回处设断点
    2.第一次请求
    3.取消断点
    4.第二次请求
    5.将第一次请求放行
    这样的话第一次的结果会错误的拿到第二次的结果。

    2019-07-17 18:52:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载