日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java中的Reference類型用法說明

瀏覽:130日期:2022-08-23 17:17:24

本文簡要總結java中的Reference類型。

最近在研讀jdk并發框架,其中AQS是重點,由于我打破砂鍋問到底的輕微強迫癥,google了AQS作者Doug Lea的論文原文[The java.util.concurrent Synchronizer Framework],有興趣的同學可以自行下載。其中談到設計同步框架的核心是選擇一個嚴格意義上的FIFO隊列,作為阻塞線程隊列并對其進行維護。

對此主要由兩種選擇,一個是MCS鎖,另一個時CLH鎖。因為CLH鎖比MCS對取消和超時的處理更方便,所以AQS就選擇將CLH鎖作為基礎對其進行改進。于是我又打算先弄懂什么是CLH鎖,在網上搜索了一圈之后找到很多人對CLH鎖進行了java實現,實現中用到了ThreadLocal類型,于是我發現我好像對ThreadLocal也不太熟,于是去看openjdk的源碼,又發現ThreadLocal的內部類ThreadLocalMap中的Entry是繼承自WeakReference,好了,既然這幾個我好像都沒弄得很明白過,所以我決定先了解一下Reference。

在我們平時開發過程中很少會遇到需要與各種不同類型的reference打交道的時候,所以很多時候我們在自己寫的代碼中很少會碰到需要使用不同的reference類型,可能很多人也會向我這樣,想要深入學習一下jdk源碼或者其他某些框架的源碼的時候才會看到諸如WeakReference這樣的類型。

問題

假設在一個應用中,需要從一個名為test的數據庫表中獲取數據。但凡有點經驗的開發人員都會避免應用獲取相同的數據每次都去查詢數據庫,因為I/O操作過去頻繁勢必會降低應用性能。

顯然,我們首先想到的就是使用緩存。應用首先查詢緩存,如果需要的數據存在直接拿來用就好;如果緩存未命中,才去數據庫查詢,并且把查詢到的數據放入緩存,以便下次應用發起相同請求時可以直接從緩存獲取數據而不用再次去數據庫查詢。

使用緩存會提高性能嗎?

答案是這需要根據具體情況分析,如果從test獲取需要緩存的數據量較少,使用緩存會非常合適且一定會提升性能。但假若需要從test表查詢放到緩存里的數據量非常大,那就會出現一個問題:由于數據量過大可能會導致內存不足,而不單單是提升性能了。假如說把表中所有數據都放入緩存,那么緩存的可能會占據大部分jvm的內存或者索性直接產生一個OOM錯誤。

解決方案

最佳的方案是如果我們可以創造一種可以按需擴展和收縮的動態緩存,當我們的數據量需要而內存充裕的時候可以適當增加,但內存不足是可以按不同方案對其進行回收。

目的

這里引出的一個問題,就是為什么要在Java中使用不同類型的reference?我們的應用在運行過程中會產生很多對象,這些對象駐留在內存中,它們大小不同,重要性不同,使用頻率不同,生命周期不同,比如有些對象只要應用啟動就一直存活直到應用停止,而有些對象生命周期與創建它的線程相同,還有些對象只作臨時變量短時間就消亡,再比如某些緩存數據,內存充裕的時候可以存活,內存不足的時候可能需要被首先犧牲被回收,所以很容易想象對于不同的對象,我們希望對他們的創建銷毀采取不同的策略,可是不幸的是java不像C一樣可以由開發者決定對象的析構銷毀,而是將管理內存的活統一交給了jvm進行gc,但jvm顯然不知道這些對象的區別。

于是設計者們在java 1.2加入了reference,使jvm可以對不同的reference對象采取不同的回收策略以達到提高應用性能的目的。

java.lang.ref 包

實際上java.lang.ref包中就有以下幾種不同的reference類型,分別是:

StrongReference

SoftReference

WeakReference

PhantomReference

FinalReference

java中的Reference類型用法說明

StrongReference

我們發現在類圖中我們并沒有發現 StrongReference 類型,原因是我們平時寫的代碼基本上都是 StrongReference 。我們最常的創建對象方式就是 new 一個對象,然后將其賦值給一個聲明為這個對象的類型及其父類的引用。如果對象有一個 StrongReference ,那么這個對象將不會被gc回收。

舉例

HelloWorld hello = new HelloWorld();

這里 hello 就是一個 HelloWorld 對象的 StrongReference。

SoftReference

如果一個對象沒有 StrongReference 但存在一個 SoftReference ,那么 gc 將會在虛擬機需要釋放一些內存的時候回收這個對象。可以通過對對象的 SoftReference 調用 get() 方法獲取該對象。如果這個對象沒有被 gc 回收,則返回此對象,否則返回 null 。

WeakReference

如果一個對象沒有 StrongReference 但有存在一個 WeakReference ,那么 gc 將會在下一次運行時對其進行回收,哪怕虛擬機的內存還足夠多。

PhantomReference 與 FinalReference

如果某個對象沒有以上這些類型的引用,那么它可能有一個 PhantomReference 。PhantomReference 不能用于直接訪問對象。調用 get() 方法都會返回 null 。

FinalReference 與虛擬機密切相關,這里先挖個坑,下次再具體解析。

對象可達性判斷

當前主流java虛擬機都是采用 GC Roots Tracing 算法,比如 Sun 的 Hotspot 虛擬機便是采用該算法。java虛擬機進行gc時,判斷一個對象的被引用情況決定是否回收,都是從根節點引用(Root set of Reference)開始標識可達路徑的。對于某個對象可能會存在其多個引用,且這多個引用的類型不同。

如下圖所示:

java中的Reference類型用法說明

Root Tracing 算法根據以下兩個原則標記對象的可達性:

單一路徑中,以最弱的引用為準

多路徑中,以最強的引用為準

如上圖所示,對對象4存在3條引用路徑:(1)(4),(2)(5),(3)(6)。那么從根對象到對象4的最強引用時(2)(5),因為(2)和(5)都是強引用。如果對象4僅存在一條(1)(4)引用,那么對它的引用就是最弱的引用為準,也就是 SoftReference ,對象4就是 softly-reachable 對象。

不同類型 reference java 代碼舉例

package com.example.reference;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public class ReferenceExample { private String status ='Hi I am active'; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return 'ReferenceExample [status=' + status + ']'; } public void strongReference() { ReferenceExample ex = new ReferenceExample(); System.out.println(ex); } public void softReference() { SoftReference<ReferenceExample> ex = new SoftReference<ReferenceExample>(getRefrence()); System.out.println('Soft refrence :: ' + ex.get()); } public void weakReference() { int counter=0; WeakReference<ReferenceExample> ex = new WeakReference<ReferenceExample>(getRefrence()); while(ex.get()!=null) { counter++; System.gc(); System.out.println('Weak reference deleted after:: ' + counter + ex.get()); } } public void phantomReference() throws InterruptedException { final ReferenceQueue queue = new ReferenceQueue(); PhantomReference<ReferenceExample> ex = new PhantomReference<ReferenceExample>(getRefrence(),queue); System.gc(); queue.remove(); System.out.println('Phantom reference deleted after'); } private ReferenceExample getRefrence() { return new ReferenceExample(); } public static void main(String[] args) { ReferenceExample ex = new ReferenceExample(); ex.strongReference(); ex.softReference(); ex.weakReference(); try { ex.phantomReference(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}Output :ReferenceExample [status=Hi I am active]Soft refrence :: ReferenceExample [status=Hi I am active]Weak reference deleted after:: 1nullPhantom reference deleted after

總結

通過對以上各類型的 reference 介紹可以發現其實 reference 主要是用來與虛擬機 gc 進行交互,使得虛擬機根據對象的不同引用類型,對其采用不同的內存回收策略。

strong 引用的對象正常情況下不會被回收,soft 引用的對象會在出現 OOM 錯誤之前被回收,而 weak 引用的對象在下一次 gc 的時候就會被回收,對 reference 的基本理解就差不多了。

至于 PhantomReference 與 FinalReference 下次再講。

以上這篇java中的Reference類型用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产69精品久久| 水蜜桃久久夜色精品一区| 日本91福利区| 日韩专区欧美专区| 日韩精品一区二区三区av | 91国内精品| 久久精品毛片| 午夜久久久久| 日本国产亚洲| 蜜臀国产一区| 丝袜美腿一区二区三区| 日韩1区2区日韩1区2区| 日韩一区二区三区免费播放| 蜜臀久久99精品久久久画质超高清| 久久99高清| 久久国产日本精品| 亚洲资源网站| 国产乱码精品一区二区三区四区 | 国产精品毛片一区二区三区| 91精品国产一区二区在线观看 | 日韩一区二区三区高清在线观看| 精品亚洲自拍| 欧美综合二区| 国产一区二区三区四区| 亚洲精品成人| 麻豆成人91精品二区三区| 美女少妇全过程你懂的久久| 国产欧美综合一区二区三区| 国产一区日韩一区| 国产精品国产三级在线观看| 九九在线精品| 久久不卡日韩美女| 久久99伊人| 高潮一区二区| 欧美一区免费| 国产视频一区三区| 成人三级高清视频在线看| 最新亚洲国产| 三上悠亚国产精品一区二区三区| 亚洲精品自拍| 久久在线91| 日韩视频在线一区二区三区 | 黄色国产精品| 精品中文在线| 一区二区精彩视频| 欧美aa在线观看| 国产九一精品| 亚洲欧美日韩国产一区二区| 伊人久久av| 91九色综合| 亚洲欧美日韩国产综合精品二区| 久久精品福利| 日韩中文字幕视频网| 欧美+亚洲+精品+三区| 老司机精品视频网| 日韩精品社区| 中文一区一区三区高中清不卡免费| 日韩精品三级| 一区二区自拍| 久久天堂成人| 水蜜桃精品av一区二区| 国产欧美日韩精品一区二区免费 | 波多视频一区| 91麻豆精品激情在线观看最新| 欧美精品羞羞答答| 青青青免费在线视频| 国产欧美自拍一区| 午夜性色一区二区三区免费视频| 影视先锋久久| 国产96在线亚洲| 综合激情视频| 久久久精品久久久久久96 | 日韩一区二区久久| 久久精品福利| 亚洲精品看片| 久久久影院免费| 国产精品亚洲片在线播放| 在线综合亚洲| 欧美日韩在线观看首页| 欧美精品福利| 亚洲在线电影| 日韩在线网址| 激情综合自拍| 国产99精品| 亚洲伦乱视频| 日韩三级视频| 国产在线不卡一区二区三区| 国产精品一区二区av交换| 日韩一区二区三区精品视频第3页| 久久最新视频| 久久性天堂网| 亚洲免费一区三区| 国产高潮在线| 国产视频亚洲| 尤物tv在线精品| 黑森林国产精品av| 久久爱www.| 欧美精品国产白浆久久久久| 亚洲欧美日韩精品一区二区| 国产一区二区三区四区| 日韩国产一区二区三区| 日韩毛片网站| 欧美日韩一区二区三区不卡视频| 日韩一区精品| 国产午夜一区| 精品国产亚洲一区二区三区在线 | 日韩av午夜在线观看| 亚洲精选成人| 国产欧美综合一区二区三区| 夜夜嗨一区二区| 久久精品国产一区二区| 欧美一区91| 日韩欧美高清一区二区三区| 国产精品日韩精品在线播放| 国产精品任我爽爆在线播放| 精品亚洲免a| 另类中文字幕国产精品| 精品一区在线| 在线精品一区| 国产精品三级| 最近高清中文在线字幕在线观看1| 蜜桃视频在线网站| 欧美日韩色图| 免费在线观看一区二区三区| 久久精品xxxxx| 97精品在线| 91高清一区| 日韩av三区| 日韩av专区| 黄色日韩精品| 日韩精品中文字幕一区二区| 美日韩一区二区三区| 天堂日韩电影| 蜜桃传媒麻豆第一区在线观看| 91九色综合| 亚洲综合电影| 免费在线观看一区二区三区| 国产欧美日韩| 欧美日韩尤物久久| 亚洲精品综合| 麻豆视频久久| 久久在线视频免费观看| 亚洲tv在线| 久久视频一区| 欧美永久精品| 国产一区二区三区不卡av| se01亚洲视频 | 久久视频国产| 欧美.日韩.国产.一区.二区| 蜜桃av一区二区三区电影| 日本麻豆一区二区三区视频| 国产精品二区不卡| 国产视频一区免费看| 国产精品视频一区二区三区四蜜臂 | 蜜桃视频在线观看一区| 久久久久伊人| 亚洲免费播放| 国产极品久久久久久久久波多结野| 精品成人免费一区二区在线播放| 在线看片一区| 国产一区日韩| 亚洲制服少妇| 荡女精品导航| 蜜桃视频一区二区三区| 天堂av在线| 人人爱人人干婷婷丁香亚洲| 久久美女精品| 国产伦理久久久久久妇女| 999精品色在线播放| 91精品福利观看| 免费视频一区三区| 麻豆一区在线| 美女国产一区| 国产一区二区三区精品在线观看| 国产精品宾馆| 日韩中文在线电影| 美国欧美日韩国产在线播放| 日产精品一区二区| 中文字幕日韩亚洲| 秋霞影院一区二区三区| 奇米777国产一区国产二区| 日韩和的一区二在线| 国产日本亚洲| 欧美日韩国产综合网| 美女视频网站久久| 亚洲免费网址| 日韩av福利| 国产精品毛片aⅴ一区二区三区| 亚洲激情欧美| 国产精品高颜值在线观看| 日本亚洲三级在线| 99久久亚洲精品蜜臀| 国产精品欧美一区二区三区不卡| 合欧美一区二区三区| 日本不卡免费高清视频在线| 国产精品亚洲四区在线观看| 蜜桃视频一区二区三区| 伊人久久大香线蕉av不卡| 岛国精品一区| 国产精品中文字幕亚洲欧美|