真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎樣深入理解Java多線程與并發(fā)框中的synchronized關(guān)鍵字

怎樣深入理解Java多線程與并發(fā)框中的synchronized 關(guān)鍵字,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有寶雞免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、Class文件與對(duì)象

對(duì)象頭 32位JVM的對(duì)象頭

二、synchronized 三種應(yīng)用方式

用于實(shí)例對(duì)象方法(對(duì)象是鎖) 用于靜態(tài)方法(類是鎖) 用于同步代碼塊(同步代碼塊是鎖)

三、synchronized 底層語義原理

鎖:就在對(duì)象頭中

Java 虛擬機(jī)中的同步(Synchronization)基于 進(jìn)入enter 和 退出exit 監(jiān)視器(Monitor)對(duì)象 實(shí)現(xiàn), 無論是顯式同步(有明確的 monitorenter 和 monitorexit 指令,即同步代碼塊)還是隱式同步都是如此。在 Java 語言中,同步用的最多的地方可能是被 synchronized 修飾的同步方法。同步方法 并不是由 monitorenter 和 monitorexit 指令來實(shí)現(xiàn)同步的,而是由方法調(diào)用指令讀取運(yùn)行時(shí)常量池中方法的 ACC_SYNCHRONIZED 標(biāo)志來隱式實(shí)現(xiàn)的,關(guān)于這點(diǎn),稍后詳細(xì)分析。下面先來了解一個(gè)概念Java對(duì)象頭,這對(duì)深入理解synchronized實(shí)現(xiàn)原理非常關(guān)鍵。

1. 對(duì)象加鎖: 使用 monitorenter 和 monitorexit 指令分別獲取控制權(quán)和釋放控制權(quán)。

2. 方法加鎖:

方法級(jí)的同步是隱式,即無需通過字節(jié)碼指令來控制的,它實(shí)現(xiàn)在方法調(diào)用和返回操作之中。JVM可以從方法常量池中的方法表結(jié)構(gòu)(method_info Structure) 中的 ACC_SYNCHRONIZED 訪問標(biāo)志區(qū)分一個(gè)方法是否同步方法。當(dāng)方法調(diào)用時(shí),調(diào)用指令將會(huì)檢查方法的 ACC_SYNCHRONIZED 訪問標(biāo)志是否被設(shè)置,如果設(shè)置了,執(zhí)行線程將先持有monitor(虛擬機(jī)規(guī)范中用的是監(jiān)視器一詞), 然后再執(zhí)行方法,最后再方法完成(無論是正常完成還是非正常完成)時(shí)釋放monitor。在方法執(zhí)行期間,執(zhí)行線程持有了monitor,其他任何線程都無法再獲得同一個(gè)monitor。如果一個(gè)同步方法執(zhí)行期間拋 出了異常,并且在方法內(nèi)部無法處理此異常,那這個(gè)同步方法所持有的monitor將在異常拋到同步方法之外時(shí)自動(dòng)釋放。

四、JVM對(duì)synchronized的優(yōu)化

背景:Java 6之后,為了減少獲得鎖和釋放鎖所帶來的性能消耗,引入了 偏向鎖 和 輕量級(jí)鎖。 鎖的狀態(tài):無鎖狀態(tài)、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖。 鎖從 偏向鎖 -> 輕量級(jí)鎖 -> 重量級(jí)鎖 的鎖升級(jí)是單向的、不可逆的,沒有 鎖降級(jí) 這一說。

1. 偏向鎖

因此為了減少同一線程獲取鎖(會(huì)涉及到一些CAS操作,耗時(shí))的代價(jià)而引入偏向鎖。偏向鎖的核心思想是,如果一個(gè)線程獲得了鎖,那么鎖就進(jìn)入偏向模式,此時(shí)Mark Word 的結(jié)構(gòu)也變?yōu)槠蜴i結(jié)構(gòu),當(dāng)這個(gè)線程再次請(qǐng)求鎖時(shí),無需再做任何同步操作,即獲取鎖的過程,這樣就省去了大量有關(guān)鎖申請(qǐng)的操作,從而也就提供程序的性能。

2. 輕量級(jí)鎖

輕量級(jí)鎖所適應(yīng)的場(chǎng)景是 線程交替執(zhí)行同步塊 的場(chǎng)合,如果存在 同一時(shí)刻訪問同一鎖 的場(chǎng)合,就會(huì)導(dǎo)致輕量級(jí)鎖膨脹為重量級(jí)鎖。

3. 自旋鎖

自旋鎖是樂觀的一種表現(xiàn),樂觀的認(rèn)為很大概率是能夠獲得鎖的。(根據(jù)阿里巴巴Java開發(fā)規(guī)范:如果每次訪問沖突的概率小于 20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數(shù)不得小于3次。)

4. 重入鎖

從互斥鎖的設(shè)計(jì)上來說,當(dāng)一個(gè)線程試圖操作一個(gè)由其他線程持有的對(duì)象鎖的臨界資源時(shí),將會(huì)處于阻塞狀態(tài),但當(dāng)一個(gè)線程再次請(qǐng)求自己持有對(duì)象鎖的臨界區(qū)的資源時(shí),這種情況屬于 *重入鎖,請(qǐng)求將會(huì)成功,在java中synchronized是基于原子性的內(nèi)部鎖機(jī)制,是可重入的,因此在一個(gè)線程調(diào)用synchronized方法的同時(shí)在其方法體內(nèi)部調(diào)用該對(duì)象另一個(gè)synchronized方法,也就是說一個(gè)線程得到一個(gè)對(duì)象鎖后再次請(qǐng)求該對(duì)象鎖,是允許的,這就是synchronized的可重入性。

5. 鎖消除

消除鎖是虛擬機(jī)另外一種鎖的優(yōu)化,這種優(yōu)化更徹底,Java虛擬機(jī)在JIT編譯時(shí)(可以簡(jiǎn)單理解為當(dāng)某段代碼即將第一次被執(zhí)行時(shí)進(jìn)行編譯,又稱即時(shí)編譯),通過對(duì)運(yùn)行上下文的掃描,去除不可能存在共享資源競(jìng)爭(zhēng)的鎖,通過這種方式消除沒有必要的鎖,可以節(jié)省毫無意義的請(qǐng)求鎖時(shí)間,如下StringBuffer的append是一個(gè)同步方法,但是在add方法中的StringBuffer屬于一個(gè)局部變量,并且不會(huì)被其他線程所使用,因此StringBuffer不可能存在共享資源競(jìng)爭(zhēng)的情景,JVM會(huì)自動(dòng)將其鎖消除。

五、synchronized關(guān)鍵點(diǎn)

中斷與synchronized: 事實(shí)上線程的中斷操作對(duì)于正在等待獲取的鎖對(duì)象的synchronized方法或者代碼塊并不起作用,也就是對(duì)于synchronized來說,如果一個(gè)線程在等待鎖,那么結(jié)果只有兩種,要么它獲得這把鎖繼續(xù)執(zhí)行,要么它就保存等待,即使調(diào)用中斷線程的方法,也不會(huì)生效。

看完上述內(nèi)容,你們掌握怎樣深入理解Java多線程與并發(fā)框中的synchronized 關(guān)鍵字的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站名稱:怎樣深入理解Java多線程與并發(fā)框中的synchronized關(guān)鍵字
鏈接地址:http://weahome.cn/article/ppojpo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部