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這個成員變量時就會出問題。
解決辦法有幾種:
最好重構這個類,不要有可寫的成員變量。例如變成methodOne和methodTwo這些方法的局部變量。
也可以不使用單例,而是在doGet里面每次新建一個對象。
不太好的方案是使用synchronized關鍵字,但使用不當有可能會帶來嚴重的性能問題。
添加回答
舉報
0/150
提交
取消