1.java 中常見的非線程安全類與線程安全的類
2.什么是線程安全?什么是非線程安全的?他們有什么區別?
所謂的線程安全就是指多個線程操作同一個對象,可能會出現問題(下面會介紹一個ArrayList 的例子),而線程安全的是多個線程操作同一個對象不會出現問題(Vector),線程安全會
用到synchronized ,這個也導致了性能的下降。
非線程安全≠不安全:非線程安全指的的多個線程操作同一個對象可能會出現問題,并不是在多線程中不能使用ArrayList或者其他的非線程安全的類。只要保證在多線程中操作的不是
同一個對象,就可以大膽的使用非線程的類。
3.示例:創建10 個線程,每個線程往ArrayList里面放100個元素,那么ArrayList 是不是就是10000呢?
測試結果如下,甚至有時候會報數組越界異常(線程數加大,就會出現此異常):
ArrayList
如果換成Vector呢?因為vector 是線程安全的的,結果就會是正確的。測試結果如下:
Vector
如果換成LinkedList 呢? 此類也不是線程安全的。
LinkedList
4.模擬線程安全實際是使用synchronized 實現,使用計數器實現。
代碼如下:
接著下圖
測試結果如下:
當線程達到一定數量后,多個線程操作addcount() 就會出現問題,并不是我們想要的結果10001。此時如果在方法加上synchronized 或者鎖住一個對象都可以保障線程安全?測試結果如下:
代碼
測試結果
總結:線程安全實際上是為對象加了鎖,這種雖然保證了安全,但是卻降低了性能。那么有沒有一種方法,既保障了安全,性能還能很好的保證呢?聽說ConcurrentHashMap 可以。
和hashtable 一樣是線程安全的,但是比他的效率高多了。