#30天專注成長計劃#java 線程安全與非線程安全

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 一樣是線程安全的,但是比他的效率高多了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,142評論 0 62
  • Java-Review-Note——4.多線程 標簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,677評論 2 17
  • 呵呵,今天收到了啟蒙聽聽寄的證書和繪本,大米剛一放學就要看,于是我們娘三一起讀了一本《我是怎么來的》。 新學校的數...
    悅米時光閱讀 137評論 0 0
  • 小學時代對抽煙的好奇,是從嘗試用干枯的絲瓜葉代替煙葉,用練習本代替煙紙,手工卷成的小喇叭煙開始的,人生的第一口煙...
    上孟默蒹閱讀 444評論 4 1