中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

請(qǐng)收網(wǎng)址999938關(guān)鍵詞優(yōu)化公司哪家效果好

請(qǐng)收網(wǎng)址999938,關(guān)鍵詞優(yōu)化公司哪家效果好,商務(wù)網(wǎng)站建設(shè)需要備案嗎,大型商城網(wǎng)站建設(shè)方案大家好,我是大明哥,一個(gè)專注「死磕 Java」系列創(chuàng)作的硬核程序員。 回答 在 JDK 1.6之前,synchronized 是一個(gè)重量級(jí)、效率比較低下的鎖,但是在JDK 1.6后,JVM 為了提高鎖的獲取與釋放效,,對(duì) synchronized 進(jìn)…

大家好,我是大明哥,一個(gè)專注「死磕 Java」系列創(chuàng)作的硬核程序員。


回答

在 JDK 1.6之前,synchronized 是一個(gè)重量級(jí)、效率比較低下的鎖,但是在JDK 1.6后,JVM 為了提高鎖的獲取與釋放效,,對(duì) synchronized 進(jìn)行了優(yōu)化,引入了偏向鎖輕量級(jí)鎖,至此,鎖的狀態(tài)有四種,級(jí)別由低到高依次為:無鎖、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖。

鎖升級(jí)就是無鎖 —> 偏向鎖 —> 輕量級(jí)鎖 —> 重量級(jí)鎖 的一個(gè)過程,注意,鎖只能升級(jí),不能降級(jí)。

原理詳解

對(duì)象頭

HotSpot 虛擬機(jī)中,對(duì)象在內(nèi)存中存儲(chǔ)布局可以分為三塊區(qū)域:對(duì)象頭(Header)、實(shí)例數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding):

  • 對(duì)象頭:分為Mark Word 和 對(duì)象指針
    • Mark Word:存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時(shí)間戳等。
    • 對(duì)象指針:存儲(chǔ)指向類元數(shù)據(jù)的指針,使得能夠訪問對(duì)象屬于的類的信息。
  • 實(shí)例數(shù)據(jù):存儲(chǔ)對(duì)象的實(shí)際有效信息,也就是我們?cè)陬愔兴x的各種類型的字段內(nèi)容。
  • 對(duì)齊填充:可選字段,通常存在于對(duì)象的末尾,用于確保對(duì)象的大小是8字節(jié)的倍數(shù)(因?yàn)樵S多JVM都使用8字節(jié)的對(duì)象對(duì)齊)。這是出于性能考慮,使得對(duì)象的地址在內(nèi)存中是對(duì)齊的。

synchronized 鎖相關(guān)的信息主要是在 Mark Word 區(qū)域,我們先看看 Mark Word。

Mark Word

synchronized 用的鎖存在鎖對(duì)象的對(duì)象頭的Mark Word中,我們先看 Mark Word 到底長什么樣。

鎖分類

無鎖

無鎖可以理解為單線程輕松愉快地運(yùn)行,沒有其他的線程來和其競爭。但是無鎖不代表沒有同步,它只是表示鎖對(duì)象目前沒有被任何線程顯式鎖定。

偏向鎖

偏向鎖 JDK 1.6 引入的一種鎖優(yōu)化機(jī)制。

何謂“偏向”?就是鎖對(duì)象會(huì)偏向于第一個(gè)獲得它的線程。什么意思呢。

當(dāng)一個(gè)線程訪問同步代碼塊并獲取鎖時(shí),該鎖會(huì)進(jìn)入偏向模式,鎖標(biāo)志的狀態(tài)將被設(shè)置為偏向(01),并且鎖的擁有者被設(shè)置為當(dāng)前線程(偏向鎖線程 id = 當(dāng)前線程 id)。當(dāng)該線程執(zhí)行完同步代碼塊后,線程并不會(huì)主動(dòng)釋放偏向鎖。當(dāng)線程再次進(jìn)入同步代碼塊時(shí),會(huì)首先判斷此時(shí)持有鎖的線程與它是否為同一線程,如果是則正常往下執(zhí)行,由于此前是沒有釋放鎖的,所以這次就不會(huì)有任何的獲取鎖操作。

所以,偏向鎖是指當(dāng)一段同步代碼一直被同一個(gè)線程所訪問時(shí),就不存在所謂的多線程競爭了,那么該線程在后續(xù)訪問時(shí)便會(huì)自動(dòng)獲得鎖,從而降低獲取鎖帶來的消耗,即提高性能。

偏向鎖的鎖釋放是一個(gè)被動(dòng)過程,線程不會(huì)主動(dòng)釋放偏向鎖,只有當(dāng)其他線程來競爭偏向鎖時(shí),JVM 才會(huì)檢測到鎖的狀態(tài)并觸發(fā)撤銷。但是撤銷需要等待全局安全點(diǎn)(所有線程會(huì)暫停),JVM 會(huì)在全局安全點(diǎn)時(shí)判斷鎖對(duì)象是否處于被鎖定狀態(tài),如果沒有被鎖定,且持有鎖的線程不處于活動(dòng)狀態(tài),則將對(duì)象頭設(shè)置為無鎖狀態(tài),并撤銷偏向鎖。

所以,引入偏向鎖的目的是認(rèn)為當(dāng)前環(huán)境下是不存在多線程競爭的場景,可以認(rèn)為是單線程環(huán)境,同一個(gè)線程多次持有鎖,減少單線程環(huán)境下獲取鎖帶來的不必要。

流程圖如下:

輕量級(jí)鎖

當(dāng)一個(gè)線程持有偏向鎖時(shí),另外一個(gè)線程來競爭鎖,這時(shí)偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖。

輕量級(jí)鎖的競爭方式一種比較輕量級(jí)的競爭方式,當(dāng)某個(gè)線程沒有獲取到鎖,它并不是立刻被掛起,而是采取自旋的方式來競爭鎖資源。在競爭較少的情況下,輕量級(jí)鎖通過減少線程阻塞和喚醒操作,可以提高性能。

輕量級(jí)鎖的目的在于它認(rèn)為系統(tǒng)當(dāng)前的競爭環(huán)境不是激烈,如果采取阻塞和喚醒線程的方式,則會(huì)過多地消耗系統(tǒng)資源。如果某個(gè)線程沒有獲取到輕量級(jí)鎖,則采取自旋的方式來判斷鎖資源是否已被釋放。這種方式減少了上線文的切換。

但是長時(shí)間的自旋操作是非常消耗資源的,一個(gè)線程獲取了輕量級(jí)鎖,其他線程就只能在那里“空耗”,它們不釋放 CPU 資源,但也不做任何事,這種現(xiàn)象叫做忙等busy-waiting)。所以,我們是允許短時(shí)間的忙等,用它來換取線程在用戶態(tài)和內(nèi)核態(tài)之間切換的開銷。

觸發(fā)輕量級(jí)鎖的條件是兩個(gè):

  1. 關(guān)閉偏向鎖(-XX:-UseBiasedLocking
  2. 多個(gè)線程競爭偏向鎖導(dǎo)致偏向鎖升級(jí)為輕量級(jí)鎖

流程圖如下:

重量級(jí)鎖

輕量級(jí)鎖自旋是要有限度的,你不能一直在那里空轉(zhuǎn),所以如果鎖競爭環(huán)境比較嚴(yán)重,當(dāng)自旋次數(shù)達(dá)到某個(gè)閾值(默認(rèn) 10 次,可自動(dòng)調(diào)整)后,就是停止自旋,此時(shí)鎖膨脹為重量級(jí)鎖。當(dāng)其膨脹為重量級(jí)鎖后,其他線程就不再是等待了,而是阻塞等待。重量級(jí)鎖依賴對(duì)象內(nèi)部的監(jiān)視器(monitor)實(shí)現(xiàn),而 monitor 依賴的是操作系統(tǒng)的 MutexLock(互斥鎖)。

由于是重量級(jí)鎖,那么等待鎖資源的線程都會(huì)被阻塞,雖然阻塞的線程不會(huì)消耗 CPU,但是阻塞或者喚醒一個(gè)線程都需要通過底層操作系統(tǒng)來實(shí)現(xiàn),它會(huì)涉及到上下文切換,用戶態(tài)和內(nèi)核態(tài)之間的轉(zhuǎn)換,這本身就是一個(gè)非常重量級(jí)、高開銷的操作。

鎖升級(jí)過程

鎖升級(jí)就是無鎖 —> 偏向鎖 —> 輕量級(jí)鎖 —> 重量級(jí)鎖 的一個(gè)過程,注意,鎖只能升級(jí),不能降級(jí)。流程圖如下:

  • JVM 啟動(dòng)后,鎖資源對(duì)象直到有第一個(gè)線程訪問時(shí),它都是無鎖狀態(tài),此時(shí) Mark Word 內(nèi)容如下:

偏向鎖標(biāo)識(shí)為 0,鎖標(biāo)識(shí)為 01

  • 當(dāng)鎖對(duì)象首次被某個(gè)線程(假如為線程 A,id 為 1000001)時(shí),鎖就會(huì)從無鎖狀態(tài)升級(jí)偏向鎖。偏向鎖會(huì)在 Mark Word 中的偏向鎖線程 id 存儲(chǔ)當(dāng)前線程的id(1000001),偏向鎖標(biāo)識(shí)為 1,鎖標(biāo)識(shí)為 01,如下:

如果當(dāng)前線程再次獲取該鎖對(duì)象,只需要比較偏向鎖線程 id 即可。

  • 當(dāng)有其他線程(假如為線程 B,id 為 1000002)來競爭該鎖對(duì)象,此時(shí)鎖為偏向鎖,這個(gè)時(shí)候會(huì)比較偏向鎖的線程 id 是否為線程 B 1000002,我們可以判斷不是,所以會(huì)利用 CAS 嘗試修改 Mark Word,如果成功,則線程 B 獲取偏向鎖成功,此時(shí) Mark Word 中的偏向鎖線程 id 為線程 B id 1000002

  • 但如果失敗了,就說明當(dāng)前環(huán)境可能存在鎖競爭,則需要執(zhí)行偏向鎖撤銷操作。等到全局安全點(diǎn)時(shí),JVM 會(huì)暫停持有偏向鎖的線程 A,檢查線程 A 的狀態(tài),若線程 A狀態(tài)為不活躍或者已經(jīng)執(zhí)行完了同步代碼塊,則設(shè)置鎖對(duì)象為無鎖狀態(tài)(線程 ID 為空,偏向鎖 0 ,鎖標(biāo)志位為01)重新偏向,同時(shí)恢復(fù)線程 A,繼續(xù)獲取偏向鎖。如果線程 A 的同步代碼塊還沒執(zhí)行完,則需要升級(jí)為輕量級(jí)鎖。
  • 在升級(jí)為輕量級(jí)鎖之前,持有偏向鎖的線程 A是暫停的,JVM 首先會(huì)在線程 A 的棧中創(chuàng)建一個(gè)名為鎖記錄的空間(Lock Record),用于存放鎖對(duì)象目前的 Mark Word 的拷貝,然后拷貝對(duì)象頭中的 Mark Word 到線程 A 的鎖記錄中(官方稱之為 Displaced Mark Word ),若拷貝成功,JVM 將使用 CAS 嘗試將對(duì)象頭重的 Mark Word 更新為指向線程 A 的 Lock Record 的指針,成功,線程 A 獲取輕量級(jí)鎖,此時(shí) Mark Word 的鎖標(biāo)志位為 00,指向鎖記錄的指針指向線程 A 的鎖記錄地址,如下圖:

  • 對(duì)于其他線程而言,也會(huì)在棧幀中建立鎖記錄,存儲(chǔ)鎖對(duì)象目前的 Mark Word 的拷貝。也利用 CAS 嘗試將鎖對(duì)象的 Mark Word 更正指向自身線程的 Lock Record,如果成功,表明競爭到輕量級(jí)鎖,則執(zhí)行同步代碼塊。如果失敗,那么線程嘗試使用自旋的方式來等待持有輕量級(jí)鎖的線程釋放鎖。當(dāng)然,它不會(huì)一直自旋下去,因?yàn)樽孕倪^程也會(huì)消耗 CPU,而是自旋一定的次數(shù),如果自旋了一定次數(shù)后還是失敗,則升級(jí)為重量級(jí)鎖,阻塞所有未獲取鎖的線程,等待釋放鎖后喚醒。

最后是,鎖升級(jí)過程的詳細(xì)流程(此圖來源于網(wǎng)上):

本文已收錄到我的技術(shù)網(wǎng)站:https://www.skjava.com。有全網(wǎng)最優(yōu)質(zhì)的系列文章、Java 全棧技術(shù)文檔以及大廠完整面經(jīng)

http://www.risenshineclean.com/news/27183.html

相關(guān)文章:

  • 專業(yè)建網(wǎng)站平臺(tái)網(wǎng)絡(luò)營銷是做什么的工作
  • 中山網(wǎng)站建設(shè)哪家好seo是什么服務(wù)
  • 網(wǎng)站的排版網(wǎng)絡(luò)營銷成功的案例分析
  • 連云港專業(yè)網(wǎng)站制作公司seo快排軟件
  • 惠州seo推廣公司南寧seo平臺(tái)標(biāo)準(zhǔn)
  • 網(wǎng)站域名地址查詢網(wǎng)站創(chuàng)建
  • 如何進(jìn)行優(yōu)化短視頻關(guān)鍵詞優(yōu)化
  • 網(wǎng)站模板如何編輯軟件代引流推廣公司
  • 建設(shè)網(wǎng)站一般要多錢sem工作內(nèi)容
  • 南通網(wǎng)站建設(shè)規(guī)劃成都網(wǎng)絡(luò)營銷公司哪家好
  • 網(wǎng)站優(yōu)化要怎么做seo做什么網(wǎng)站賺錢
  • 網(wǎng)站不足之處人民網(wǎng)疫情最新消息
  • 麻城做網(wǎng)站做一個(gè)網(wǎng)站需要什么
  • 知名的電子商務(wù)網(wǎng)站紹興seo公司
  • 斗破蒼穹制作公司seo關(guān)鍵詞排名優(yōu)化官網(wǎng)
  • b2b網(wǎng)站建設(shè)怎么做大學(xué)生網(wǎng)絡(luò)營銷策劃方案書
  • 建設(shè)銀行網(wǎng)站網(wǎng)頁丟失口碑營銷的優(yōu)勢(shì)有哪些
  • 畢業(yè)設(shè)計(jì)做企業(yè)門戶網(wǎng)站今日新聞?lì)^條大事
  • 重慶國外網(wǎng)站推廣企業(yè)為何選擇網(wǎng)站推廣外包?
  • 網(wǎng)站建設(shè)石家莊百度人工申訴客服電話
  • 做彩票的網(wǎng)站嗎中國企業(yè)網(wǎng)
  • 網(wǎng)站搭建教程導(dǎo)航類快速排名新
  • 如何網(wǎng)站做外貿(mào)生意廈門seo關(guān)鍵詞
  • flash網(wǎng)站設(shè)計(jì)商丘 峰少 seo博客
  • 怎么做地區(qū)網(wǎng)站林哥seo
  • 銀川哪家網(wǎng)站建設(shè)專業(yè)湖南平臺(tái)網(wǎng)站建設(shè)制作
  • 軟件測試自學(xué)網(wǎng)站考證培訓(xùn)機(jī)構(gòu)報(bào)名網(wǎng)站
  • 專門做玉的網(wǎng)站企業(yè)網(wǎng)站的在線推廣方法有
  • 做網(wǎng)站公司深圳seo優(yōu)化服務(wù)價(jià)格
  • 武漢app開發(fā)靠譜的公司湖北網(wǎng)站seo策劃