1. 程式人生 > >Vector 真的執行緒安全嗎?

Vector 真的執行緒安全嗎?

Vector裡一些寫刪操作的方法都是用synchronized實現同步,這樣vecotor在使用時真的不需要考慮執行緒安全問題嗎?

答案是否! 下面看一個例子:

Vector vector = new Vector();

public void put(String element){

if (!vector.contains(element)) 
    vector.add(element); 
}

.....

}

這個例子主要用於向vector放入資料,放入資料前先判斷集合中是否已經存在。如果不存在則放入。即最後的結果為vector集合中沒有重複的元素存在。

儘管vector中的contains()方法和 add()方法都是同步的。但是組合應用時還是存在現場安全問題。下面分析下:

假如有兩個執行緒同時進入put()方法,傳遞的引數都是一樣的,例如 put("123")。當執行緒1執行if (!vector.contains(element)) 後還沒有執行vector.add(element); 時,執行緒2進來了,此時vector.contains(element))還是返回false,這樣的結果會導致兩個123都加入到vector。所以是現場不安全的。

解決辦法:

1、在方法內使用synchronized,

synchronized(this){

if (!vector.contains(element)) 
    vector.add(element); 
}

}

....

2、參考單例模式的雙檢索方式。

if (!vector.contains(element)) 

   synchronized(this){

if (!vector.contains(element)) {

 vector.add(element); 

}

}
}
    

總結:Vector 在方法上使用同步這樣做本身沒有解決多執行緒問題,反而,在引入了概念的混亂的同時,導致效能問題,因為 synchronized 的開銷是巨大的:阻止編譯器亂序 。