1. 程式人生 > >HashTable、Vector、StringBuffer執行緒安全的原因

HashTable、Vector、StringBuffer執行緒安全的原因

一、HashTable執行緒安全的原因:put方法是synchronized的所以可以保證其執行緒安全


二、Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),但有些時候,也甭保證,比如:

Vector<String> test = Vector<String>();
.......
.......
for (i = 0; i < test.size(); i++)
{
    /////////////////在此處當前執行緒時間片到期
     
    ///執行緒重新獲取時間片,但test內元素有可能已經被其他執行緒修改
    System.out.println(test.get(i));
}
要保證執行緒安全就必需自己用synchronized把整個程式碼片段包起來。
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;
}