国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - WeakHashMap的使用方法詳解

WeakHashMap的使用方法詳解

2021-01-27 11:40旭旭同學 Java教程

這篇文章主要介紹了WeakHashMap的使用方法詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下

WeakHashMap的使用方法詳解

前言:

 在學習WeakHashMap時了解到,如果map里面的key只有map本身引用時,就會將key對應的Entry清除掉。查看WeakHashMap的源碼發現,Entry繼承了WeakReference類,并且實例化Entry對象時,所有的key都會通過調用super(key,queue)方法保存成對實際對象的弱引用。實際上,弱引用在構造時也需要傳入一個對象的強引用作為參數。例如:

?
1
2
Car car = new Car(22000,"silver");
WeakReference<Car> weakCar = new WeakReference<Car>(car);

  HashMap和WeakHashMap的區別也在于此,HashMap的key是對實際對象的強引用。

  弱引用(WeakReference)的特性是:當gc線程發現某個對象只有弱引用指向它,那么就會將其銷毀并回收內存。WeakReference也會被加入到引用隊列queue中。

  理解了相關概念之后,對WeakHashMap的實際應用感到很好奇。然后發現tomcat的源碼里,實現緩存時會用到WeakHashMap。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package org.apache.tomcat.util.collections;
 
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
 
public final class ConcurrentCache<K,V> {
 
  private final int size;
 
  private final Map<K,V> eden;
 
  private final Map<K,V> longterm;
 
  public ConcurrentCache(int size) {
    this.size = size;
    this.eden = new ConcurrentHashMap<>(size);
    this.longterm = new WeakHashMap<>(size);
  }
 
  public V get(K k) {
    V v = this.eden.get(k);
    if (v == null) {
      synchronized (longterm) {
        v = this.longterm.get(k);
      }
      if (v != null) {
        this.eden.put(k, v);
      }
    }
    return v;
  }
 
  public void put(K k, V v) {
    if (this.eden.size() >= size) {
      synchronized (longterm) {
        this.longterm.putAll(this.eden);
      }
      this.eden.clear();
    }
    this.eden.put(k, v);
  }
}

  源碼中有eden和longterm的兩個map,對jvm堆區有所了解的話,可以猜測出tomcat在這里是使用ConcurrentHashMap和WeakHashMap做了分代的緩存。在put方法里,在插入一個k-v時,先檢查eden緩存的容量是不是超了。沒有超就直接放入eden緩存,如果超了則鎖定longterm將eden中所有的k-v都放入longterm。再將eden清空并插入k-v。在get方法中,也是優先從eden中找對應的v,如果沒有則進入longterm緩存中查找,找到后就加入eden緩存并返回。

  經過這樣的設計,相對常用的對象都能在eden緩存中找到,不常用(有可能被銷毀的對象)的則進入longterm緩存。而longterm的key的實際對象沒有其他引用指向它時,gc就會自動回收heap中該弱引用指向的實際對象,弱引用進入引用隊列。longterm調用expungeStaleEntries()方法,遍歷引用隊列中的弱引用,并清除對應的Entry,不會造成內存空間的浪費。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/kaka0509/article/details/73459419

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久在线 | 日韩成人一级片 | 欧美一区二区三区免费 | 中文字幕乱码亚洲精品 | 久久99精品久久久久久久 | 成人精品视频 | 亚洲精品一区二区三区四区高清 | 99re在线 | 亚洲一区二区中文 | 五月天导航 | 午夜区 | 久草中文在线 | 三区视频 | 国产欧美日韩一区二区三区 | 国产一区视频网站 | 亚洲成人一区在线观看 | 黄色三级网站 | 色xxx| 日本中文字幕在线播放 | 亚洲精品成人天堂一二三 | 国产黄视频在线观看 | 国产视频9999| 性色av一区二区三区红粉影视 | 日韩视频精品在线观看 | a级在线| 国产精品成人一区二区三区夜夜夜 | 亚洲国产精品自拍 | 亚洲一区二区视频 | a级黄色在线观看 | 成人羞羞网站 | 日韩一区二区三区在线观看 | 日韩在线免费观看网站 | 欧美黄色影院 | 午夜激情视频在线观看 | 四虎影视永久免费观看 | 亚洲伦理 | 亚洲国产精品久久久久久 | 精品一区二区三区在线观看 | 91嫩草国产露脸精品国产 | 国产99久久久精品视频 | 一区二区国产在线观看 |