Java多线程之集合类(线程安全和不安全)
生活随笔
收集整理的這篇文章主要介紹了
Java多线程之集合类(线程安全和不安全)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java多線程之集合類(淺析線程安全和不安全)
本文目錄:
-
1.線程不安全之ArrayList,HashSet,HashMap和線程安全之CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap
-
2. 小結
-
3.解析CopyOnWrite容器
1.線程不安全之ArrayList和線程安全之CopyOnWriteArrayList
測試代碼:
- 多個線程往一個集合中添加內容。
實現:
public static void listNotSafe() {List<String> list = new ArrayList<>();for (int i = 1; i <= 30 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,6));System.out.println(list);},String.valueOf(i)).start();}編譯結果:
解決辦法:
-
使用CopyOnWriteArrayList代替ArrayList
使用如下:
public static void listNotSafe() {List<String> list = new CopyOnWriteArrayList<>();for (int i = 1; i <= 30 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,6));System.out.println(list);},String.valueOf(i)).start();}編譯結果:
小結:
-
1. 經過測試,發現HashSet,HashMap也是線程不安全的,分別對應的解決辦法是用CopyOnWriteArraySet,ConcurrentHashMap替換(如上面的例子)
3.解析CopyOnWrite容器
-
我們發現CopyOnWrite容器能夠解決線程不安全的問題,現在來通過源碼進行解析(以CopyOnWriteArrayList)為例。
源碼部分如下
其中的add(E e)方法
public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1);newElements[len] = e;setArray(newElements);return true;} finally {lock.unlock();}}可以知道:
擴展小知識:
總結
以上是生活随笔為你收集整理的Java多线程之集合类(线程安全和不安全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程之Semaphore用法
- 下一篇: Java基础之参数传递