doGet(){
SomeSingelton.methodOne("url one");
SomeSingelton.methodTwo("url two");
}
//單例實(shí)現(xiàn)省略
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設(shè)置了url one,正準(zhǔn)備執(zhí)行http get的時(shí)候,線程B設(shè)置成了url two。導(dǎo)致url one的返回值是url two的??如果有,為什么?如何避免呢?如果沒有線程安全問題請說明原因,感激不盡。
2 回答

墨色風(fēng)雨
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
有問題,servlet不是線程安全的,多個(gè)線程同時(shí)讀寫url這個(gè)成員變量時(shí)就會出問題。
解決辦法有幾種:
最好重構(gòu)這個(gè)類,不要有可寫的成員變量。例如變成methodOne和methodTwo這些方法的局部變量。
也可以不使用單例,而是在doGet里面每次新建一個(gè)對象。
不太好的方案是使用synchronized關(guān)鍵字,但使用不當(dāng)有可能會帶來嚴(yán)重的性能問題。
添加回答
舉報(bào)
0/150
提交
取消