併發容器1 vs 同步容器

同步容器vs併發容器
同步容器:Vetor HashTable
特點:
(1)不保證線程安全,需要額外加鎖訪問,訪問方式使用Iterator迭代器或for-each遍歷,加鎖訪問時間長,若不想加鎖,使用克隆的方式,但創建副本的時候,存在較大性能開銷。
(2)單線程下:不支持foreach邊迭代邊修改或刪除。可以使用Iterator迭代器邊迭代邊修改刪除。
(3)多個線程對同一個同步容器的Iterator迭代器操作,在Iterator.next()可能會發生異常。在調用Iterator時加鎖可解決。
(4)Collections.synchronizedList(),裏面可添加ArrayList,方法裏的操作,把list的add()等操作外面都加了一層Sychronized.

併發容器:CopyOnWrite系列、 Concurrent系列、 BlockingQueue系列
特點:每個併發容器的設計都不一樣,根據具體場景設計,儘量避免使用鎖。
比如CopyOnWrite系列使用克隆的方式避免併發。
ConcurrentBlockingQueue:基於queue實現FIFO隊列,隊列爲空取操作被阻塞。
ConcurentLinkedQueue:基於queue實現,隊列爲空返回null.
(1)CopyOnWrite單線程下,支持foreach邊迭代邊修改或刪除。不支持Iterator邊迭代邊修改刪除。因爲CopyOnWriteList本身不支持remove(),直接拋異常。
(2)多個線程對同一個容器foreach操作,多線程同時remove(),因爲remove()時list裏沒有這個元素了,並不會執行。和remove()的實現有關。

1、HashMap和Hashtable的區別
HashMap和Hashtable都實現了Map接口,主要的區別有:線程安全性,同步(synchronization),以及速度。HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(**HashMap可以接受爲null的鍵值(key)**和值(value),而Hashtable則不行)。

HashMap是非synchronized,而Hashtable是synchronized,意味着Hashtable是線程安全的,多個線程可以共享一個Hashtable;而多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器。HashMap可以通過下面的語句進行同步:Map m = Collections.synchronizeMap(hashMap);
https://www.cnblogs.com/steven520213/p/8192091.html

2、CopyOnWriteArrayList
內部持有一個ReentrantLock lock = new ReentrantLock(),讀寫分離,寫時複製出一個新的數組,完成插入、修改或者移除操作後將新數組賦值給array。
只是在增刪改上加鎖,但是讀不加鎖,CopyOnWriteArrayList支持讀多寫少的併發情況。

3、AtomicInteger、AtomicBolean、AtomicLog 原子更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章