bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

java偏向鎖代碼 java偏向鎖和輕量級鎖

偏向鎖原理

本文介紹偏向鎖相關(guān)原理,并不限定于Java中的偏向鎖,但是Java中偏向鎖的實現(xiàn)也是相同的原理,本文主要是對參考文獻( Quickly Reacquirable Locks )中偏向鎖實現(xiàn)重點部分的翻譯,加入了自己的理解,參考文獻稱偏向鎖為可快速獲取的鎖(QRL,Quickly Reacquirable Locks)。如何快速獲取將會在第2節(jié)介紹過相關(guān)數(shù)據(jù)結(jié)構(gòu)之后介紹。偏向鎖主要是為了提高絕大部分情況下不存在競爭、只有一個線程在嘗試獲取鎖的場景,通過相關(guān)數(shù)據(jù)結(jié)構(gòu)可以減少CAS操作的數(shù)量,提高應(yīng)用性能。偏向鎖在有多個線程競爭獲取時,會變成(論文中稱為revoke,撤銷)普通的鎖(或默認鎖),在Java中則會變先變?yōu)檩p量級鎖。

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括邗江網(wǎng)站建設(shè)、邗江網(wǎng)站制作、邗江網(wǎng)頁制作以及邗江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邗江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邗江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

相對于一般的鎖來說,偏向鎖使用了兩個額外的域(這里不能等同于Java類成員域,在Java中其實是使用對象頭中的Mark Word保存的)。第一個域是用來記錄鎖當(dāng)前狀態(tài)的域,可能的狀態(tài)包括 NEURAL , BIASED , REVOKING , DEFAULT 。

注意:撤銷和釋放(release)鎖不同,這里的撤銷(revoke)指的是從偏向鎖退化為普通鎖的過程。

初始狀態(tài)下鎖處于 NEURAL 狀態(tài),當(dāng)該鎖被第一次獲取時,獲取鎖的線程會將鎖狀態(tài)變?yōu)?BIASED 。此時如果有另一個線程悔仿友嘗試獲取同一個鎖,那么其最終會將鎖狀態(tài)變?yōu)?DEFAULT ,在變?yōu)?DEFAULT 狀態(tài)之前該鎖會根據(jù)撤銷協(xié)議先處于一個暫時的中間狀態(tài) REVOKING 。當(dāng)鎖狀態(tài)為 BIASED 時,狀態(tài)中會有一個域用來記錄當(dāng)前持有鎖的線程標識符(后文使用線程ID代替)。對于一個不可再偏向(non-rebiasable,表示一旦撤銷之后不可再次回到偏向狀態(tài))的鎖,則鎖狀態(tài)只能按照 NEURAL - BIASED - REVOKING - DEFAULT 的狀態(tài)進行切換,不可回退。但是偏向鎖也可實現(xiàn)為可重偏向的鎖(rebiasable)。

實現(xiàn)偏向鎖需要額外增加的第二個域是一個可以指示布爾類型的位(bit)即可,用來表示偏向鎖當(dāng)前持有者對鎖是獲取狀態(tài)還是碧槐釋放狀態(tài)。有了這個標識,當(dāng)偏向鎖被獲取并且沒有撤銷時,當(dāng)前持有者線程的獲取和釋放操作只要簡單的改變該域的狀態(tài)即可。

注意,一個線程獲取偏向鎖首先需要成為偏向鎖的持有者(holder),即將自己的線程ID通過CAS寫入鎖狀態(tài)域中,然后再獲取鎖(acquire),持有并不一定獲取了鎖,持有之后必須改變上面布爾標識位才獲取了鎖,但是獲取鎖之前必須要先成為鎖的持有者;釋放(release)鎖之后也需要有其他線程顯示競爭之后當(dāng)前持有者才會失去持有者身份,鎖的持有者可以通過改變上面介紹的布爾位進行鎖的獲取和釋放動作。

將鎖從初始的 NEUTRAL 狀態(tài)轉(zhuǎn)變?yōu)?BIASED 狀態(tài)可以僅通過一次CAS操作完成。這里使用CAS操作是必須的,因為需要避免多個線程同時嘗試獲取 NEUTRAL 狀態(tài)鎖并置其狀態(tài)為 BIASED 。

現(xiàn)在我們介紹第1節(jié)概述中 快速獲取 的含義,根據(jù)上面的數(shù)據(jù)結(jié)構(gòu)介紹,當(dāng)一個線程獲取了偏向鎖之后,會在鎖中記錄線程ID,鎖中也會有一個標識位用來表示該鎖目前是釋放的還是被獲取的。因此以后線程在獲取和釋放鎖時,只要檢測鎖是否記錄自己的線程ID即可,如果檢測成功,表示線程已經(jīng)是偏向鎖的持有者,直接通過改變上述布爾類型標識位域進行獲取和釋放鎖即可。如果測試失敗(表示該鎖目前持有者不是自己),則再測試一下鎖當(dāng)前狀態(tài),如果還是 BIASED 狀態(tài),則使用CAS競爭鎖,如果CAS成功,則嘗試使用CAS將鎖狀態(tài)中線程ID置為自己的線程ID,這樣后續(xù)在獲取和釋放鎖時就不用使用CAS操作了。上面測試過程沒有使用CAS操作,因此提高了性能,實現(xiàn)了 快速獲取 鎖。

實現(xiàn)上面atomic-free(表示盡可能減少CAS這樣的原子操作)偏向鎖的難點就在于如何協(xié)調(diào)獲取偏向鎖和撤銷偏向鎖的過程。必須處理偏向鎖獲取和釋放同時發(fā)生偏向鎖撤銷時的多線程競爭問題,可以通過使用CAS將鎖的狀態(tài)改為 REVOKING 來避免大瞎后一種競爭:通過CAS將鎖狀態(tài)改為 REVOKING 也可能會有多線線程同時進行,但是CAS保證只有一個線程會成功改變鎖狀態(tài),稱為真正的撤銷者(revoker),其他的線程則嘗試著獲取默認鎖(默認鎖即偏向鎖撤銷完成之后變成 DEFAULT 狀態(tài)的鎖)。

下面介紹偏向鎖操作過程(獲取、釋放、撤銷等)的四種主要場景:

參考文獻后面還介紹了可再偏向(rebiasable)鎖的實現(xiàn)原理,即在合適的時機再次嘗試將鎖從 DEFALUT 狀態(tài)置為 BIASED 狀態(tài),這里不再介紹,有興趣可以看看參考文獻。

Dave D., Villiam S.; Quickly Reacquirable Locks

在java中有哪些鎖

給你整理了Java中的一早茄褲些鎖:

公平鎖/非公平鎖

可重入陸簡鎖

獨享鎖/共享鎖

互斥鎖/讀寫鎖

樂觀鎖/悲觀鎖

分段鎖

偏向鎖/輕量級鎖/重量級鎖

自旋鎖

上面是很多鎖的名詞,這些分類并不是全是指鎖的狀態(tài),有的指鎖納圓的特性,有的指鎖的設(shè)計

揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)詳細資料大全

《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》是2017年電子工業(yè)出版社出版的圖書,作者是封亞飛。

基本介紹 書名 :揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn) 作者 :封亞飛 ISBN :9787121315411 頁數(shù) :察辯中700 出版時間 :2017-06? 開本 :16開 千 字 數(shù) :942 內(nèi)容簡介,目錄, 內(nèi)容簡介 《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》從源碼角度解讀HotSpot的內(nèi)部實現(xiàn)機制,本書主要包含三大部分——JVM數(shù)據(jù)結(jié)構(gòu)設(shè)計與實現(xiàn)、執(zhí)行引擎機制及記憶體分配模型。 數(shù)據(jù)結(jié)構(gòu)部分包括Java位元組碼檔案格式、常量池解析、欄位解析、方法解析。每一部分都給出詳細的源碼實現(xiàn)分析,例如欄位解析一章,從源碼層面詳細分析了Java欄位重排、欄位繼承等關(guān)鍵機制。再如方法解析一章,給出了Java多態(tài)特性在源碼層面的實現(xiàn)方式。《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》通過直接對原始碼的分析,從根本上梳理和澄清Java領(lǐng)域中的關(guān)鍵概念和機制。 執(zhí)行引擎部分包括Java方法調(diào)用機制、棧幀創(chuàng)建機制、指令集架構(gòu)與解釋器實現(xiàn)機制。這一話題是《敗山揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》技術(shù)含量高的部分,需要讀者具備一定的匯編基礎(chǔ)。不過千萬不要被“匯編”這個詞給嚇著,其實在作者看來,匯編相比于高級語言而言,語法非常簡單,語義也十分清晰。執(zhí)行引擎部分重點描述Java原始碼如何轉(zhuǎn)換為位元組碼,又如何從位元組碼轉(zhuǎn)換為機器指令從而能夠被物理CPU所執(zhí)行的技術(shù)實現(xiàn)。同時詳細分析了Java函式堆疊的創(chuàng)建全過程,在源碼分析的過程中,帶領(lǐng)讀者從本質(zhì)上理解到底什么是Java函式堆疊和棧幀,以及棧幀灶此內(nèi)部的詳細結(jié)構(gòu)。 記憶體分配部分主要包括類型創(chuàng)建與載入、對象實例創(chuàng)建與記憶體分配,例如new關(guān)鍵字的工作機制,import關(guān)鍵字的作用,再如java.lang.ClassLoader.loadClass()接口的本地實現(xiàn)機制。 《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》并不是簡單地分析源碼實現(xiàn),而是在描述HotSpot內(nèi)部實現(xiàn)機制的同時,分析了HotSpot如此這般實現(xiàn)的技術(shù)必然性。讀者在閱讀《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》的過程中,將會在很多地方看到作者本人的這種思考。 目錄 第1章 Java虛擬機概述 1 1.1 從機器語言到Java——詹爺,你好 1 1.2 兼容的選擇:一場生產(chǎn)力的革命 6 1.3 中間語言翻譯 10 1.3.1 從中間語言翻譯到機器碼 11 1.3.2 通過C程式翻譯 11 1.3.3 直接翻譯為機器碼 13 1.3.4 本地編譯 16 1.4 神奇的指令 18 1.4.1 常見匯編指令 20 1.4.2 JVM指令 21 1.5 本章總結(jié) 24 第2章 Java執(zhí)行引擎工作原理:方法調(diào)用 25 2.1 方法調(diào)用 26 2.1.1 真實的機器調(diào)用 26 2.1.2 C語言函式調(diào)用 41 2.2 JVM的函式調(diào)用機制 47 2.3 函式指針 53 2.4 CallStub函式指針定義 60 2.5 _call_stub_entry例程 72 2.6 本章總結(jié) 115 第3章 Java數(shù)據(jù)結(jié)構(gòu)與面向?qū)ο?117 3.1 從Java算法到數(shù)據(jù)結(jié)構(gòu) 118 3.2 數(shù)據(jù)類型簡史 122 3.3 Java數(shù)據(jù)結(jié)構(gòu)之偶然性 129 3.4 Java類型識別 132 3.4.1 class位元組碼概述 133 3.4.2 魔數(shù)與JVM內(nèi)部的int類型 136 3.4.3 常量池與JVM內(nèi)部對象模型 137 3.5 大端與小端 143 3.5.1 大端和小端的概念 146 3.5.2 大小端產(chǎn)生的本質(zhì)原因 148 3.5.3 大小端驗證 149 3.5.4 大端和小端產(chǎn)生的場景 151 3.5.5 如何解決位元組序反轉(zhuǎn) 154 3.5.6 大小端問題的避免 156 3.5.7 JVM對位元組碼檔案的大小端處理 156 3.6 本章總結(jié) 159 第4章 Java位元組碼實戰(zhàn) 161 4.1 位元組碼格式初探 161 4.1.1 準備測試用例 162 4.1.2 使用javap命令分析位元組碼檔案 162 4.1.3 查看位元組碼二進制 165 4.2 魔數(shù)與版本 166 4.2.1 魔數(shù) 168 4.2.2 版本號 168 4.3 常量池 169 4.3.1 常量池的基本結(jié)構(gòu) 169 4.3.2 JVM所定義的11種常量 170 4.3.3 常量池元素的復(fù)合結(jié)構(gòu) 170 4.3.4 常量池的結(jié)束位置 172 4.3.5 常量池元素總數(shù)量 172 4.3.6 第一個常量池元素 173 4.3.7 第二個常量池元素 174 4.3.8 父類常量 174 4.3.9 變數(shù)型常量池元素 175 4.4 訪問標識與繼承信息 177 4.4.1 aess_flags 177 4.4.2 this_class 178 4.4.3 super_class 179 4.4.4 interface 179 4.5 欄位信息 180 4.5.1 fields_count 180 4.5.2 field_info fields[fields_count] 181 4.6 方法信息 185 4.6.1 methods_count 185 4.6.2 method_info methods[methods_count] 185 4.7 本章回顧 205 第5章 常量池解析 206 5.1 常量池記憶體分配 208 5.1.1 常量池記憶體分配總體鏈路 209 5.1.2 記憶體分配 215 5.1.3 初始化記憶體 223 5.2 oop-klass模型 224 5.2.1 兩模型三維度 225 5.2.2 體系總覽 227 5.2.3 oop體系 229 5.2.4 klass體系 231 5.2.5 handle體系 234 5.2.6 oop、klass、handle的相互轉(zhuǎn)換 239 5.3 常量池klass模型(1) 244 5.3.1 klassKlass實例構(gòu)建總鏈路 246 5.3.2 為klassOop申請記憶體 249 5.3.3 klassOop記憶體清零 253 5.3.4 初始化mark 253 5.3.5 初始化klassOop._metadata 258 5.3.6 初始化klass 259 5.3.7 自指 260 5.4 常量池klass模型(2) 261 5.4.1 constantPoolKlass模型構(gòu)建 261 5.4.2 constantPoolOop與klass 264 5.4.3 klassKlass終結(jié)符 267 5.5 常量池解析 267 5.5.1 constantPoolOop域初始化 268 5.5.2 初始化tag 269 5.5.3 解析常量池元素 271 5.6 本章總結(jié) 279 第6章 類變數(shù)解析 280 6.1 類變數(shù)解析 281 6.2 偏移量 285 6.2.1 靜態(tài)變數(shù)偏移量 285 6.2.2 非靜態(tài)變數(shù)偏移量 287 6.2.3 Java欄位記憶體分配總結(jié) 312 6.3 從源碼看欄位繼承 319 6.3.1 欄位重排與補白 319 6.3.2 private欄位可被繼承嗎 325 6.3.3 使用HSDB驗證欄位分配與繼承 329 6.3.4 引用類型變數(shù)記憶體分配 338 6.4 本章總結(jié) 342 第7章 Java棧幀 344 7.1 entry_point例程生成 345 7.2 局部變數(shù)表創(chuàng)建 352 7.2.1 constMethod的記憶體布局 352 7.2.2 局部變數(shù)表空間計算 356 7.2.3 初始化局部變數(shù)區(qū) 359 7.3 堆疊與棧幀 368 7.3.1 棧幀是什么 368 7.3.2 硬體對堆疊的支持 387 7.3.3 棧幀開辟與回收 390 7.3.4 堆疊大小與多執(zhí)行緒 391 7.4 JVM的棧幀 396 7.4.1 JVM棧幀與大小確定 396 7.4.2 棧幀創(chuàng)建 399 7.4.3 局部變數(shù)表 421 7.5 棧幀深度與slot復(fù)用 433 7.6 最大運算元棧與運算元棧復(fù)用 436 7.7 本章總結(jié) 439 第8章 類方法解析 440 8.1 方法簽名解析與校驗 445 8.2 方法屬性解析 447 8.2.1 code屬性解析 447 8.2.2 LVTLVTT 449 8.3 創(chuàng)建methodOop 455 8.4 Java方法屬性復(fù)制 459 8.5 與 461 8.6 查看運行時位元組碼指令 482 8.7 vtable 489 8.7.1 多態(tài) 489 8.7.2 C++中的多態(tài)與vtable 491 8.7.3 Java中的多態(tài)實現(xiàn)機制 493 8.7.4 vtable與invokevirtual指令 500 8.7.5 HSDB查看運行時vtable 502 8.7.6 miranda方法 505 8.7.7 vtable特點總結(jié) 508 8.7.8 vtable機制邏輯驗證 509 8.8 本章總結(jié) 511 第9章 執(zhí)行引擎 513 9.1 執(zhí)行引擎概述 514 9.2 取指 516 9.2.1 指令長度 519 9.2.2 JVM的兩級取指機制 527 9.2.3 取指指令放在哪 532 9.2.4 程式計數(shù)器在哪里 534 9.3 解碼 535 9.3.1 模板表 535 9.3.2 匯編器 540 9.3.3 匯編 549 9.4 棧頂快取 558 9.5 棧式指令集 565 9.6 運算元棧在哪里 576 9.7 棧幀重疊 581 9.8 entry_point例程機器指令 586 9.9 執(zhí)行引擎實戰(zhàn) 588 9.9.1 一個簡單的例子 588 9.9.2 位元組碼運行過程分析 590 9.10 位元組碼指令實現(xiàn) 597 9.10.1 iconst_3 598 9.10.2 istore_0 599 9.10.3 iadd 600 9.11 本章總結(jié) 601 第10章 類的生命周期 602 10.1 類的生命周期概述 602 10.2 類載入 605 10.2.1 類載入——鏡像類與靜態(tài)欄位 611 10.2.2 Java主類載入機制 617 10.2.3 類載入器的載入機制 622 10.2.4 反射載入機制 623 10.2.5 import與new指令 624 10.3 類的初始化 625 10.4 類載入器 628 10.4.1 類載入器的定義 628 10.4.2 系統(tǒng)類載入器與擴展類載入器創(chuàng)建 634 10.4.3 雙親委派機制與破壞 636 10.4.4 預(yù)載入 638 10.4.5 引導(dǎo)類載入 640 10.4.6 載入、連結(jié)與延遲載入 641 10.4.7 父載入器 645 10.4.8 載入器與類型轉(zhuǎn)換 648 10.5 類實例分配 649 10.5.1 棧上分配與逃逸分析 652 10.5.2 TLAB 655 10.5.3 指針碰撞與eden區(qū)分配 657 10.5.4 清零 658 10.5.5 偏向鎖 658 10.5.6 壓棧與取指 659 10.6 本章總結(jié) 661

偏向鎖、輕量級鎖、重量級鎖

1、java對象內(nèi)存布局分成對象頭、實例數(shù)據(jù)部分和填充對其;

2、所有java對象的頭部(Object Header)分成了兩個基本部分:mark word和類型指針;

2、第一個部分是mark word 部分,放置了對象自身運行時的一些數(shù)據(jù),梁斗包括HashCode、或渣耐 GC分代年齡、鎖狀態(tài)標志、偏向鎖的線程ID等;它占用一個字寬的大小,在32和64位操作系統(tǒng)上,分別是32bit和64bit;mark word被設(shè)計為用最小的存儲空間盡量的存儲多類型的數(shù)據(jù);它會在鎖狀態(tài)衫春不同的情況下,動態(tài)調(diào)整存儲格式,以存儲不同狀態(tài)的數(shù)據(jù);

3、 另一個部分存儲了指向方法區(qū)對象類型數(shù)據(jù)的指針,如果是數(shù)組對象,還會有額外的一部分存儲數(shù)組的長度。

?也就是互斥鎖,是傳統(tǒng)的調(diào)用底層的mutex互斥量來實現(xiàn)的同步方式;所謂重量級,就是指其調(diào)用的資源占用還是相比較大,因為java目前主流的線程的實現(xiàn)還是一比一映射到內(nèi)核線程之上的、線程的阻塞、喚醒都需要操作系統(tǒng)的協(xié)助來完成,這就避免不了用戶態(tài)與和系統(tǒng)核心態(tài)的切換,這種狀態(tài)的轉(zhuǎn)換需要耗費很多的處理器時間。

???

網(wǎng)站題目:java偏向鎖代碼 java偏向鎖和輕量級鎖
本文路徑:http://vcdvsql.cn/article18/ddpspgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管Google定制網(wǎng)站做網(wǎng)站企業(yè)網(wǎng)站制作網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)