java原始碼分析

2021-07-27 10:51:56 字數 1683 閱讀 5387

在往佇列中插入資料由下面幾個函式,他們的區別就是對佇列滿的情況處理不同

- put 一直等待著

- offer(無時間) 如果空了直接返回false

- offer(有時間) 等待指定的時間,在指定時間內如果空了,那麼插入,負責返回false

- add 丟擲乙個illegalstateexception異常

首先來看put實現

public

void

put(e e) throws interruptedexception finally

}

首先需要獲取鎖,並把鎖設定成可中斷的。 然後判斷是不是有空閒(count == items.length表示滿了),如果沒有空閒的空間,就通過await()一直等待著。 一直到有空閒了,通過insert進行插入。因為使用了可重入的鎖,需要unlock解鎖

然後我們來看下insert的實現

private

void

insert(e x)

把元素放到佇列的最後面,對應的下標+1,數量也+1,最後通過signal通知其他執行緒有空閒的了

再來看下offer(無時間的)

public boolean offer(e e) 

} finally

}

很簡單,就看是否有空,沒有空的直接返回false,否則就插入並返回true

然後來看看有時間版本的offer

public boolean offer(e e, long timeout, timeunit unit)

throws interruptedexception

insert(e);

return

true;

} finally

}

當沒有空間的時候,就等待指定的時間,如果等待時間到了還沒有空,返回false,否則就插入並返回true

同樣消費也有好幾個版本的,他們的區別也都是對佇列是空的情況的處理

- take

- poll(有時間)

- poll(沒有時間)

我們看下take

public e take() throws interruptedexception  finally 

}

如果佇列是空的,那麼一直等著,知道有元素可以消費,然後呼叫extract進行消費,同樣最後需要釋放鎖

我們在看下extract的實現

private e extract()
把佇列尾部的資料拿出來,尾部往前面挪動下,資料-1,最後通知其他執行緒佇列有空的了

然後看下沒有時間版本的poll

public e poll()  finally 

}

如果空的,就直接但會空的了

有時間版本的poll

public e poll(long timeout, timeunit unit) throws interruptedexception 

return extract();

} finally

}

這個如果是空的,那麼就等待設定的時間,時間到了還沒有就返回空的

《Java原始碼分析》 LinkedHashMap

public class linkedhashmap extends hashmap implements map從結構可以看出,linkedhashmap繼承hashmap並實現了map介面。下面幾個是linkedhashmap的建構函式,每個建構函式都是直接呼叫父類hashmap的建構函式來完成...

Java原始碼分析之ArrayList

自我學習原始碼,也借鑑了網上其他的資料,有寫的不準確的地方,請輕噴,謝謝 1 繼承自abstractlist類 2 實現了randomaccess介面,randomaccess介面是list 實現所使用的標記介面,用來表明其支援快速 通常是固 定時間 隨機訪問。此介面的主要目的是允許一般的演算法更改...

java集合相關原始碼分析

hashmap 原始碼分析 hashset 原始碼分析 arraylist 原始碼分析 concurrentmap 原始碼分析 2018 03 25 map 綜述 一 徹頭徹尾理解 hashmap map 綜述 二 徹頭徹尾理解 linkedhashmap map 綜述 三 徹頭徹尾理解 concu...