Java中synchronized關(guān)鍵字如何應(yīng)用-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Java中synchronized關(guān)鍵字如何應(yīng)用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站專(zhuān)業(yè)為企業(yè)提供新羅網(wǎng)站建設(shè)、新羅做網(wǎng)站、新羅網(wǎng)站設(shè)計(jì)、新羅網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、新羅企業(yè)網(wǎng)站模板建站服務(wù),十余年新羅做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一 synchronized機(jī)制

synchronized關(guān)鍵字是JAVA中常用的同步功能,提供了簡(jiǎn)單易用的鎖功能。synchronized有三種用法,分別為:

用在普通方法上,能夠鎖住當(dāng)前對(duì)象。用在靜態(tài)方法上,能夠鎖住類(lèi)用在代碼塊上,鎖住的是synchronized()里的對(duì)象

在JDK6之前,synchronized使用的是重量級(jí)鎖制,在之后synchronized加入了鎖膨脹機(jī)制,顯著提升了synchronized關(guān)鍵字的效率。

基于synchronized關(guān)鍵字,我們來(lái)了解下幾種類(lèi)別的鎖,并且講解synchronized的鎖膨脹機(jī)制。

synchronized鎖是非公平鎖。并且一個(gè)被synchronized鎖住的對(duì)象或類(lèi),就是一把鎖。

另外一提,所有鎖都是存儲(chǔ)在Java對(duì)象頭里的,Java對(duì)象頭里的Mark Word里默認(rèn)存儲(chǔ)對(duì)象的HashCode,分代年齡和鎖標(biāo)記位。也就是說(shuō)Mark Word記錄了鎖的狀態(tài)

二 鎖膨脹機(jī)制與幾類(lèi)鎖

鎖膨脹是不可逆的

2.1 偏向鎖

synchronized在JDK1.6以后默認(rèn)開(kāi)啟偏向鎖synchronized最初都是偏向鎖

表現(xiàn):一個(gè)線程獲取鎖成功后,會(huì)在對(duì)象頭里記錄線程ID,以后該線程獲取和釋放鎖都沒(méi)有任何花費(fèi)。(因?yàn)樵撴i已經(jīng)被綁定在該線程上了,且在膨脹前不會(huì)改變),如果其他線程嘗試獲取這個(gè)鎖,偏向鎖將會(huì)膨脹為輕量鎖

優(yōu)點(diǎn):在只有一個(gè)線程使用鎖的時(shí)候獲取和退出鎖沒(méi)有任何花費(fèi)

缺點(diǎn):鎖競(jìng)爭(zhēng)激烈會(huì)很快升級(jí)為輕量鎖,那么維持偏向鎖的過(guò)程就是在浪費(fèi)計(jì)算機(jī)資源。(不過(guò)因?yàn)?code>偏向鎖本身就很輕量,因此浪費(fèi)的資源并不多)

小結(jié):只有一個(gè)線程使用鎖的情況下,synchronized使用的鎖為偏向鎖。如果鎖競(jìng)爭(zhēng)激烈,可以通過(guò)配置JDK禁用偏向鎖。

2.2 輕量鎖

一把鎖不止一個(gè)線程使用,則偏向鎖膨脹為輕量鎖

表現(xiàn):線程獲取輕量鎖時(shí),會(huì)直接用CAS修改對(duì)象頭里鎖的記錄,如果修改失敗,代表此時(shí)鎖存在多個(gè)線程的競(jìng)爭(zhēng),輕量鎖將會(huì)膨脹為重量鎖。

優(yōu)點(diǎn):在線程之間使用鎖不存在競(jìng)爭(zhēng)時(shí),一次CAS操作就能獲取和退出鎖

缺點(diǎn):與偏向鎖類(lèi)似

小結(jié):只要一把鎖不止一個(gè)線程獲取過(guò),偏向鎖就會(huì)膨脹為輕量鎖。

2.3 重量鎖

一把鎖存在多線程競(jìng)爭(zhēng),則輕量鎖開(kāi)始自旋,自旋一定次數(shù)后仍沒(méi)獲取鎖,則膨脹為重量鎖(存在競(jìng)爭(zhēng)時(shí),輕量鎖雖然會(huì)先自旋,但是最終往往都會(huì)膨脹為重量鎖)

表現(xiàn):線程獲取重量鎖時(shí),如果獲取失?。存i已被其他線程獲?。?,則使用自適應(yīng)自旋鎖,自旋一定次數(shù)后仍沒(méi)獲取鎖,則進(jìn)入阻塞隊(duì)列等待。

優(yōu)點(diǎn):未獲取到的鎖進(jìn)入阻塞隊(duì)列,節(jié)約CPU資源。(好吧感覺(jué)其實(shí)是沒(méi)有啥優(yōu)點(diǎn))

缺點(diǎn):重量鎖是通過(guò)對(duì)象內(nèi)部的監(jiān)視器(monitor)實(shí)現(xiàn),其中monitor的本質(zhì)是依賴(lài)于底層操作系統(tǒng)的Mutex Lock實(shí)現(xiàn),操作系統(tǒng)實(shí)現(xiàn)線程之間的切換需要從用戶(hù)態(tài)到內(nèi)核態(tài)的切換,切換成本非常高。

小結(jié):只要一把鎖存在多線程競(jìng)爭(zhēng),輕量鎖就會(huì)膨脹為重量鎖

自旋鎖

synchronized輕量鎖,重量鎖,使用了自適應(yīng)自旋鎖進(jìn)行性能優(yōu)化

首先介紹自旋鎖

表現(xiàn):線程獲取鎖失敗后,不會(huì)進(jìn)入阻塞等待,而是再次嘗試去獲取鎖,如此反復(fù),直到獲取到鎖,或者自旋結(jié)束那么會(huì)阻塞等待。

解決問(wèn)題:在某些場(chǎng)景下,線程持有鎖的時(shí)間非常短。在線程獲取鎖失敗后,如果線程進(jìn)入阻塞將會(huì)帶來(lái)線程上下文的切換,上下文切換的時(shí)間可能反而高于線程反復(fù)嘗試獲取鎖的時(shí)間。此時(shí)線程原地等待去重復(fù)獲取鎖。反而在性能上更有優(yōu)勢(shì)。

缺點(diǎn):

單核CPU沒(méi)有線程并行,反復(fù)嘗試會(huì)導(dǎo)致進(jìn)程無(wú)法繼續(xù)運(yùn)行。重復(fù)嘗試導(dǎo)致了CPU的占用,如果CPU資源緊張的話反而會(huì)性能下降如果鎖的競(jìng)爭(zhēng)時(shí)間過(guò)長(zhǎng),不僅沒(méi)有性能提升,還浪費(fèi)了大量CPU資源。

優(yōu)化:使用自適應(yīng)自旋鎖。自適應(yīng)自旋鎖會(huì)根據(jù)之前的鎖獲取記錄,優(yōu)化調(diào)整自旋時(shí)間,避免造成不必要的自旋。

看完上述內(nèi)容,你們對(duì)Java中synchronized關(guān)鍵字如何應(yīng)用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前題目:Java中synchronized關(guān)鍵字如何應(yīng)用-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://muchs.cn/article10/deoddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版品牌網(wǎng)站制作、小程序開(kāi)發(fā)移動(dòng)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

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

成都做網(wǎng)站