成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

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

一 synchronized機制

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

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

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

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

synchronized鎖是非公平鎖。并且一個被synchronized鎖住的對象或類,就是一把鎖。

另外一提,所有鎖都是存儲在Java對象頭里的,Java對象頭里的Mark Word里默認存儲對象的HashCode,分代年齡和鎖標記位。也就是說Mark Word記錄了鎖的狀態(tài)

二 鎖膨脹機制與幾類鎖

鎖膨脹是不可逆的

2.1 偏向鎖

synchronized在JDK1.6以后默認開啟偏向鎖,synchronized最初都是偏向鎖

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

優(yōu)點:在只有一個線程使用鎖的時候獲取和退出鎖沒有任何花費

缺點:鎖競爭激烈會很快升級為輕量鎖,那么維持偏向鎖的過程就是在浪費計算機資源。(不過因為偏向鎖本身就很輕量,因此浪費的資源并不多)

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

2.2 輕量鎖

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

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

優(yōu)點:在線程之間使用鎖不存在競爭時,一次CAS操作就能獲取和退出鎖

缺點:與偏向鎖類似

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

2.3 重量鎖

一把鎖存在多線程競爭,則輕量鎖開始自旋,自旋一定次數(shù)后仍沒獲取鎖,則膨脹為重量鎖(存在競爭時,輕量鎖雖然會先自旋,但是最終往往都會膨脹為重量鎖)

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

優(yōu)點:未獲取到的鎖進入阻塞隊列,節(jié)約CPU資源。(好吧感覺其實是沒有啥優(yōu)點)

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

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

自旋鎖

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

首先介紹自旋鎖

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

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

缺點:

單核CPU沒有線程并行,反復嘗試會導致進程無法繼續(xù)運行。重復嘗試導致了CPU的占用,如果CPU資源緊張的話反而會性能下降如果鎖的競爭時間過長,不僅沒有性能提升,還浪費了大量CPU資源。

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

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

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

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

廣告

聲明:本網(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)站
洪泽县| 双峰县| 武清区| 万盛区| 疏附县| 托克托县| 泗水县| 濮阳县| 石棉县| 五华县| 永川市| 阳山县| 贞丰县| 镇江市| 井陉县| 孟连| 万盛区| 绥化市| 玛纳斯县| 木里| 来安县| 河东区| 肇州县| 台安县| 桐梓县| 朝阳县| 颍上县| 曲阜市| 满洲里市| 壤塘县| 金平| 鄂伦春自治旗| 丰镇市| 白城市| 历史| 高碑店市| 讷河市| 福鼎市| 通河县| 乌兰察布市| 滨州市|