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

发布于 2022-08-24 23:56:08 字数 503 浏览 5 评论 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的??如果有,为什么?如何避免呢?
如果没有线程安全问题请说明原因,感激不尽。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

说好的呢 2022-08-31 23:56:08

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

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

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

风轻花落早 2022-08-31 23:56:08

有问题,servlet不是线程安全的,多个线程同时读写url这个成员变量时就会出问题。

解决办法有几种:

  1. 最好重构这个类,不要有可写的成员变量。例如变成methodOne和methodTwo这些方法的局部变量。
  2. 也可以不使用单例,而是在doGet里面每次新建一个对象。
  3. 不太好的方案是使用synchronized关键字,但使用不当有可能会带来严重的性能问题。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文