併發容器

一、
有N張火車票,多線程售票
1、放arraylist ,銷售一張remove()一次 出現 重賣,超賣
2、放Vector ,調用remove ,問題依舊,因爲雖然集合vector的判斷和remove爲原子性
但是放一起執行 中間的調用代碼無法保持原子性,
3、加入sycnize,鎖住當前對象,問題解決,但效率低
4、使用隊列 static Queue<String> tickets = new ConcurrentLinkedQueue<>();
  支持多線程,調用String s = tickets.poll();判斷s==null;break; 判斷完之後沒有對隊列進行操作,不會出現問題,而且沒有加鎖,效率高

二、多線程什麼容器效率比較高
map的key即使用set實現
ConcurrentHashMap 分段鎖,鎖定一部分(8分之一)對象,鎖粒度小  效率高
ConcurrentSkipListMap 跳錶  高併發並且排序 效率低,查詢排序快 
HashTable 鎖定整個容器對象  中 

三、CopyOnWriteArrayList 寫實複製。先複製一份,再操作,讀不用加鎖,寫的效率低 適合寫的很少讀的很多的場景,比如事件監聽器

四、ConcurrentLinkedQueue 併發加鎖
Queue<String> strs = new ConcurrentLinkedQueue<>();
strs.offer 添加
strs.poll  拿出第一個同時刪除改元素
strs.peek  拿出但是不刪除
都返回是否操作成功的結果

Deque 雙向隊列 隊列頭尾都可以添加跟拿出

五、BlockingQueue 阻塞式
1、LinkedBlockingQueue 的strs.put 如果滿了,就會等待 strs.take 如果空了,就等待,無界隊列
2、ArrayBlockingQueue 有界隊列 strs.add超出長度也就是越界 報異常,offer不會報,但也不會加入成功 strs.put 滿了就會等待,程序阻塞
3、DelayQueue 每個元素還有多久時間可以取 
場景:定時執行任務
使用之前需實現接口Delay
4、LinkedTransferQueue 高併發
消費者 提供者線程中,一般是提供者提供資源到隊列,消費者從隊列獲取,但是transferQueue的話如果提供者發現有消費者等待,不用放隊列,直接給消費者。實時處理
5、SynchronousQueue同步隊列  特殊的TransferQueue
容量爲0。
不能調用add,用put,不能存元素,而是直接交給消費者


 

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