上面在講到Segment數組的時候,已經提過根據key的hash計算出在那一個Segment裏面。下面具體看下Segment是怎麼從緩存中取出的。
V get(K key, int hash, CacheLoader<? super K, V> loader) {
//當沒有數據時,就直接load再載入
if(count == 0) return lockedGetOrLoad(key, hash, loader);
}finally{
}
}
之前有提過ReferenceEntry,他裏面有個 ReferenceEntry next ,指向前一個。這就代表着他是個指針。3->2->1->null。先取出的是3 (先進後取)
- 當沒有key時,載入取出
V lockedGetOrLoad(K key, int hash, CacheLoader<? super K, V> loader) {
ReferenceEntry<K, V> e; //這個是value
ValueReference<K, V> valueReference = null;
boolean createNewEntry = true;//是否要創建
lock(); //鎖定
}