多執行緒高併發程式設計學習筆記三

2021-09-12 07:28:19 字數 2439 閱讀 6558

高併發程式設計學習筆記三:併發容器/佇列

1. map/set的選擇使用

1. 不需要執行緒安全

hashmap:無序的key- value 1.建立table來儲存entry 2.hashcode(key)得到鍵值對應該存放的位置 3.用equal方法比較key,如果相同覆蓋資料,如果不同接到下面形成鍊錶

treemap:有順序的紅黑樹實現的map

linkedhashmap:hashmap和雙向鍊錶合二為一即是linkedhashmap,它是乙個將所有entry節點鏈入乙個雙向鍊錶雙向鍊錶的hashmap。每個entry增加了兩個引數before與next來標註前後兩個entry是誰,從而實現了有序的hashmap

2. 需要執行緒安全(併發並不高的情況)

hashtable:執行緒安全的hashmap,方法上都加了synchronized

collections.synchronized***:傳入不加鎖的map/list,返回給乙個包裝好的加鎖執行緒安全的map/list。

3.需要執行緒安全(併發並不高的情況)

concurrenthashmap:無序,分段鎖不像hashtable那樣把整個hashmap都鎖定起來。分段鎖定,需要哪一段就鎖定哪一段,所以效率更高。

concurrentskiplistmap:預設以key值公升序排列的map,有序。

2.copyonwritelist:寫的效率非常低,讀的效率非常高

1.為什麼寫的效率非常低:每次寫入資料,先把list複製然後將需要寫入的資料放到list的末尾,然後將引用重新制定到新的list上面

2.為什麼讀的效率高:因為讀的方法不需要加鎖了

3.concurrentlinkedqueue/concurrentlinkeddeque:單向鍊錶佇列與雙向鍊錶佇列(併發佇列)

1. offer():相當於add方法新增乙個物件到佇列中

2. poll():getandremovefirst方法

3. peek():get方法,並不會從佇列中remove    

4. 雙向鍊錶佇列與之類似,只是可以雙向操作

4. blockingqueue阻塞式佇列:如果滿了等待,如果空了等待

1.linkedbq:鍊錶實現的阻塞式佇列,無邊界

2.arraybq:陣列實現的阻塞式佇列,有邊界

public class linkedbolockingqueue  catch (interruptedexception e) 

}}).start();

}//消費者執行緒

for(int i=0;i<10;i++) catch (interruptedexception e)

}}).start();}}

}

5. delayqueue延遲佇列:執行定時任務,在該佇列中新增元素的時候需要指定多長時間之後執行該元素,而且新增的元素需要實現delayed介面,實現內部比較器。

public class delayqueue 

}static class mytask implements delayed

//設定時間單位

@override

public long getdelay(timeunit unit)

//內部比較器

@override

public int compareto(delayed o)

}}

6.transferqueue:阻塞式佇列,transferqueue是乙個繼承了blockingqueue的介面,並且增加若干新的方法。linkedtransferqueue是transferqueue介面的實現類,其定義為乙個無界的佇列,具有先進先出(fifo)的特性。

如果有消費者執行緒在等待,立馬把元素移交給消費之執行緒,如果沒有。將元素放入佇列末尾,然後生產者執行緒堵塞,直到有人取走

linkedtransferqueue實現了乙個重要的介面transferqueue,該介面含有下面幾個重要方法:

1. transfer(e e):若當前存在乙個正在等待獲取的消費者執行緒,即立刻移交之;否則,會插入當前元素e到佇列尾部,並且等待進入阻塞狀態,到有消費者執行緒取走該元素。

2. trytransfer(e e):若當前存在乙個正在等待獲取的消費者執行緒(使用take()或者poll()函式),使用該方法會即刻轉移/傳輸物件元素e;若不存在,則返回false,並且不進入佇列。這是乙個不阻塞的操作。

3. trytransfer(e e, long timeout, timeunit unit):若當前存在乙個正在等待獲取的消費者執行緒,會立即傳輸給它;否則將插入元素e到佇列尾部,並且等待被消費者執行緒獲取消費掉;若在指定的時間內元素e無法被消費者執行緒獲取,則返回false,同時該元素被移除。

7.synchronusqueue:同步容器阻塞式佇列,特殊的transferqueue,他的容量為0,所有的元素必須馬上交給消費者。不能放到容器中

多執行緒程式設計學習筆記 使用併發集合(三)

接上文 多執行緒程式設計學習筆記 使用併發集合 一 接上文 多執行緒程式設計學習筆記 使用併發集合 二 四 使用concurrentbag建立乙個可擴充套件的爬蟲 本示例在多個獨立的即可生產任務又可消費任務的工作者間如何擴充套件工作量。1.程式 如下。using system using syste...

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...

多執行緒高併發

個人總結,帶有個人主觀,請選擇性 1,實現 runable 2,使用 thread 3,執行緒池建立 executorse newcachedthreadpool 其實哪有那麼多建立方式,本質上都是實現了runable 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...