溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

發(fā)布時(shí)間:2021-05-14 17:39:41 來(lái)源:億速云 閱讀:146 作者:Leah 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)使用java怎么實(shí)現(xiàn)雙重檢查鎖定,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

在Java程序中,有時(shí)候可能需要推遲一些高開(kāi)銷(xiāo)的對(duì)象初始化操作,并且只有在使用這些對(duì)象時(shí)才進(jìn)行初始化 。這稱(chēng)為延遲初始化或懶加載

    看一個(gè)不安全的延遲初始化:

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

A線程執(zhí)行1后,發(fā)現(xiàn)對(duì)象instance為null,準(zhǔn)備對(duì)其new,而B(niǎo)線程卻先new了,這造成了錯(cuò)誤

  我們可以利用同步鎖,保證正確:

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

   但是對(duì)整個(gè)方法進(jìn)行同步開(kāi)銷(xiāo)太大,人們想出了雙重檢查鎖定:

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

最小范圍所用同步鎖,利用雙重檢查看似實(shí)現(xiàn)了目的,但這出現(xiàn)了一個(gè)問(wèn)題:當(dāng)A線程4執(zhí)行時(shí),線程B的7還未執(zhí)行完成,而線程A判定instance != null.   線程B的7還未執(zhí)行完成,為什么會(huì)出現(xiàn)這種情況?

   看一下new Instance()的底層關(guān)鍵實(shí)現(xiàn):

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

其實(shí)是先執(zhí)行1分配內(nèi)存,然后再初始化對(duì)象和設(shè)置instance.然后這里存在重排,2和3的順序可能被調(diào)換:

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

所以當(dāng)B還執(zhí)行完7時(shí),A在4判定instance對(duì)象已經(jīng)完成初始化了,如果在ctorInstance(memory)之前去調(diào)用instance就會(huì)出錯(cuò)。

  解決辦法有兩個(gè):

1.將instance對(duì)象聲明為volatile,它會(huì)禁止2,3的重排

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

 2.利用基于類(lèi)初始化的解決方案 :JVM在類(lèi)的初始化階段(即在Class被加載后,且被線程使用之前),會(huì)執(zhí)行類(lèi)的初始化。在

執(zhí)行類(lèi)的初始化期間,JVM會(huì)去獲取一個(gè)鎖。這個(gè)鎖可以同步多個(gè)線程對(duì)同一個(gè)類(lèi)的初始化

使用java怎么實(shí)現(xiàn)雙重檢查鎖定

常用的java框架有哪些

1.SpringMVC,Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)Web框架。2.Shiro,Apache Shiro是Java的一個(gè)安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。4.Dubbo,Dubbo是一個(gè)分布式服務(wù)框架。5.Maven,Maven是個(gè)項(xiàng)目管理和構(gòu)建自動(dòng)化工具。6.RabbitMQ,RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器。7.Ehcache,EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架。

看完上述內(nèi)容,你們對(duì)使用java怎么實(shí)現(xiàn)雙重檢查鎖定有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI