为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2018-10-09 18:19:49
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这个成员变量时就会出问题。

解决办法有几种:

  1. 最好重构这个类,不要有可写的成员变量。例如变成methodOne和methodTwo这些方法的局部变量。

  2. 也可以不使用单例,而是在doGet里面每次新建一个对象。

  3. 不太好的方案是使用synchronized关键字,但使用不当有可能会带来严重的性能问题。


查看完整回答
反对 回复 2018-10-14
  • 2 回答
  • 0 关注
  • 1142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信