回覆列表
-
1 # 木子李ovo
-
2 # 混不吝的大叔
根據不同的情況可能存在的情況有:
1、如果該方法不涉及寫公共的資源比如一個靜態的變數或者寫檔案,修改某個資料庫的值的時候沒有影響。
2、比如你這個類裡的方法只是對輸入的引數做一個計算然後返回計算的值就沒有影響。
3、但是如果是修改公共的資源比如修改資料庫中儲存的一個value則有可能出現問題,如:
public void writeDb(String key, String value) {
collectiondb();
write(key, value);
closeDbCollection();
}
4、因為Java的執行緒執行順序是不一定的,可以第一個執行緒執行完連線資料庫到後掛起了,這時候第二個執行緒開始執行,如果你的collectiondb()處理使用的是類中的一個例項變數Connection conn來儲存資料庫的連線,當第二個執行緒執行完畢以後conn也被關閉了,第一個執行緒繼續執行write函式寫資料庫值的時候就會丟擲異常。
這是一個例子,還有其他可能產生髒資料的問題。
多執行緒如果使用公共資源的話最好在方法上宣告synchronized關鍵字讓其同步
這個要看方法的功能,如果方法是修改同一個變數的話,有可能造成執行緒不同步,也就是說如果都把一個公用變數5 -1的話,2個執行緒都呼叫有可能結果是4,因為他們有可能都拿到5,然後都對5 -1,然後賦值給原來的變數。如果這個方法只是透過傳入的引數計算後返回值,不涉及到修改公用變數的話,一點影響也沒有
不過當兩個執行緒都被鎖定了以後,如果含有相同物件則當同時執行是不可能的,同時執行都只是假象。同一時間,只可能有一個執行緒被處理