HashTable、Vector、StringBuffer執行緒安全的原因
阿新 • • 發佈:2019-01-26
一、HashTable執行緒安全的原因:put方法是synchronized的所以可以保證其執行緒安全
二、Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),但有些時候,也甭保證,比如:
要保證執行緒安全就必需自己用synchronized把整個程式碼片段包起來。Vector<String> test = Vector<String>(); ....... ....... for (i = 0; i < test.size(); i++) { /////////////////在此處當前執行緒時間片到期 ///執行緒重新獲取時間片,但test內元素有可能已經被其他執行緒修改 System.out.println(test.get(i)); }
synchronized(test)
{
...
}
類似的我們經常用到的場景比如:
synchronized(map){
Object value = map.get(key);
if(value == null)
{
value = new Object();
map.put(key,value);
}
return value;}
上面程式碼中 map 即使是執行緒安全的也沒有用,如果不在外面加synchronized,map.get和map.put之間的程式碼片段都有可能被其他執行緒重入,可能出現同一個key對應多個value.另一方面,其他情況下可能不需要執行緒同步,這時候所謂執行緒安全就是多餘了。StringBuffer就是個典型的例子,我還從來沒見過有人把StringBuffer用在多執行緒中。顯然SUN也認識到了這點,重寫了一個功能相同的但不支援執行緒安全的StringBuilder,後期的編譯器中把String相加的程式碼都用StringBuilder實現。
三、StringBuffer
public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }