天天看點

和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

3 構造方法

3.1 無參

注意這是沒有無參構造方法的哦!必須設定容量!

3.2 有參

  • 建立具有給定(固定)容量和預設通路政策(非公平)的ArrayBlockingQueue
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料
  • 建立具有給定(固定)容量和指定通路政策的ArrayBlockingQueue
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料
  • 建立一個具有給定(固定)容量,指定通路政策并最初包含給定集合的元素的ArrayBlockingQueue,該元素以集合的疊代器的周遊順序添加.
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

fair 參數

指定

讀寫鎖

是否公平

  • 公平鎖,鎖競争按先來先到順序
  • 非公平鎖,鎖競争随機

3 新增資料

ArrayBlockingQueue有不同的幾個資料添加方法,add、offer、put方法,資料都會按照 putIndex 的位置新增.

3.1 add

  • 如果可以在不超過隊列容量的情況下立即将指定元素插入此隊列的尾部,則在成功插入時傳回true,如果此隊列已滿則抛出IllegalStateException.
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料
  • 調用的是抽象父類 AbstractQueue的 add 方法
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

offer

  • 之後又是調用的自身實作的 offer 方法.
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

enqueue

在目前放置位置插入元素,更新并發出信号.

僅在持有鎖時可以調用

  • 内部繼續調用入隊方法
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料
  • 類似的看 put 方法.

3.2 put

  • 将指定的元素插入此隊列的末尾,如果隊列已滿,則等待空間變為可用.
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料
  • 實作類似 add,不再贅述.

4 取資料

從隊首取資料,我們以 poll 為例看源碼.

4.1 poll

和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

dequeue

  • 提取目前位置的元素,更新并發出信号.僅在持有鎖時可調用.
  • 和阿裡面試官扯了半小時ArrayBlockingQueue源碼(中)3 構造方法3 新增資料4 取資料

繼續閱讀