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

doGet(){
SomeSingelton.methodOne("urlone");
SomeSingelton.methodTwo("urltwo");
}
//单例实现省略
publicclassSomeSingelton{
privateStringurl;
publicstaticvoidmethodOne(Stringurl){
setUrl(url);
//httpgeturl
}
publicstaticvoidmethodTwo(Stringurl){
setUrl(url);
//httpgeturl
}
}会不会有线程A设置了urlone,正准备执行httpget的时候,线程B设置成了urltwo。导致urlone的返回值是urltwo的??如果有,为什么?如何避免呢?
如果没有线程安全问题请说明原因,感激不尽。
芜湖不芜
浏览 404回答 2
2回答

慕码人2483693

有问题,servlet不是线程安全的,多个线程同时读写url这个成员变量时就会出问题。解决办法有几种:最好重构这个类,不要有可写的成员变量。例如变成methodOne和methodTwo这些方法的局部变量。也可以不使用单例,而是在doGet里面每次新建一个对象。不太好的方案是使用synchronized关键字,但使用不当有可能会带来严重的性能问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript