本文小編從網上載入,原文地址http://www.cnblogs.com/chy2055/p/5175969.html
1:ArrayList是非線程安全的,Vector是線程安全的;HashMap是非線程安全的,HashTable是線程安全的;StringBuilder是非線程安全的,StringBuffer是線程安全的。
2:線程安全:
當多個線程類并發操作某類的某個方法,(在該方法內部)來修改這個類的某個成員變量的值,不會出錯,則我們就說,該的這個方法是線程安全的。
某類的某方法是否線程安全的關鍵是:
(1)?該方法是否修改該類的成員變量;
(2)?是否給該方法加鎖(是否用synchronized關鍵字修飾)。
3:線程不安全:
當多個線程類并發操作某類的某個方法,(在該方法內部)來修改這個類的某個成員變量的值,很容易就會發生錯誤,故我們就說,這個方法是線程不安全的。如果要把這個方法變成線程安全的,則用synchronized關鍵字來修飾該方法即可。
注:用synchronized關鍵字修飾方法,會導致加鎖,雖然可以使該方法線程安全,但是會極大的降低該方法的執行效率,故要慎用該關鍵字。
用 ArrayList還是Vector,二者如何取舍?
線程安全:指多線程操作同一個對象的某方法,修改該類的成員變量時,不會出現錯誤。
非線程安全:指多線程操作同一個對象的某方法,修改該類的成員變量時,可能會出現錯誤。
線程安全必須要使用很多synchronized關鍵字來同步控制,所以必然會導致性能的降低。
所以在使用的時候,如果是多個線程操作同一個對象,那么使用線程安全的Vector;否則,就使用效率更高的ArrayList。
非線程安全!=不安全
有人在使用過程中有一個不正確的觀點:我的程序是多線程的,不能使用ArrayList要使用Vector,這樣才安全。
非線程安全并不是多線程環境下就不能使用。注意上面有說到:多線程操作同一個對象。注意是同一個對象
比如最上面那個模擬,就是在主線程中new的一個ArrayList然后多個線程操作同一個ArrayList對象,就會有安全問題。
如果是每個線程中new一個ArrayList,而這個ArrayList只在這一個線程中使用,那么肯定是沒安全問題的。
總結:
若多個線程同時修改某個外部傳來的對象的成員變量,很容易就會出現錯誤,我們稱之為線程不安全。(該類的這個方法是線程不安全的。若要線程安全,用synchronized關鍵字修飾即可)。