日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java數(shù)據(jù)庫(kù)中的樂(lè)觀(guān)鎖簡(jiǎn)介 (java 數(shù)據(jù)庫(kù)的樂(lè)觀(guān)鎖)

隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,數(shù)據(jù)庫(kù)在企業(yè)中的應(yīng)用越來(lái)越廣泛。在大量并發(fā)訪(fǎng)問(wèn)的情況下,數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性和完整性都十分重要。數(shù)據(jù)庫(kù)鎖機(jī)制的應(yīng)用就成為了保證數(shù)據(jù)安全和正確性的重要手段。樂(lè)觀(guān)鎖是數(shù)據(jù)庫(kù)鎖機(jī)制的一種,本篇文章將為您講解Java數(shù)據(jù)庫(kù)中的樂(lè)觀(guān)鎖。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),襄汾企業(yè)網(wǎng)站建設(shè),襄汾品牌網(wǎng)站建設(shè),網(wǎng)站定制,襄汾網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,襄汾網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

一、什么是樂(lè)觀(guān)鎖?

樂(lè)觀(guān)鎖是數(shù)據(jù)庫(kù)中一種輕量級(jí)的鎖機(jī)制,不會(huì)阻塞其他的SQL語(yǔ)句執(zhí)行,而是通過(guò)對(duì)比當(dāng)前數(shù)據(jù)與原始數(shù)據(jù)是否一致來(lái)判斷是否有其他事務(wù)的修改操作。由于其輕量級(jí)的特性,樂(lè)觀(guān)鎖常被用于高并發(fā)的場(chǎng)景中,而且往往可以帶來(lái)比悲觀(guān)鎖更好的性能。

二、樂(lè)觀(guān)鎖的實(shí)現(xiàn)原理

樂(lè)觀(guān)鎖的實(shí)現(xiàn)主要依賴(lài)于版本控制機(jī)制,其基本思想是在數(shù)據(jù)表中添加一列版本號(hào)(version),每次數(shù)據(jù)更新時(shí),同時(shí)更新版本號(hào)。當(dāng)數(shù)據(jù)被多個(gè)事務(wù)訪(fǎng)問(wèn)時(shí),每個(gè)事務(wù)都會(huì)獲取數(shù)據(jù)的原始版本號(hào),當(dāng)修改操作提交時(shí),樂(lè)觀(guān)鎖會(huì)通過(guò)比較當(dāng)前的版本號(hào)和事務(wù)最初獲取的版本號(hào),確定是否允許提交修改。

在Java數(shù)據(jù)庫(kù)開(kāi)發(fā)中,樂(lè)觀(guān)鎖的實(shí)現(xiàn)一般有以下兩種方式:

1. 使用版本字段機(jī)制:在數(shù)據(jù)表中添加一個(gè)版本控制列,并在每次更新操作中將該字段也更新。當(dāng)更新數(shù)據(jù)時(shí)查詢(xún)?cè)撔袛?shù)據(jù)的版本號(hào),如果更新前后的版本號(hào)相同,說(shuō)明該數(shù)據(jù)行沒(méi)有被其他事務(wù)修改,可以正常更新。如果版本號(hào)不同,說(shuō)明該數(shù)據(jù)已被其他事務(wù)修改,則更新操作失敗。

2. 使用CAS(Compare And Swap)機(jī)制:CAS機(jī)制是樂(lè)觀(guān)鎖的另一種實(shí)現(xiàn)方式,可以將其視為對(duì)Java的互斥鎖的一種優(yōu)化。CAS是一種無(wú)鎖的原子操作,通過(guò)比較內(nèi)存地址上的值和指定的值是否相等來(lái)判斷是否需要修改內(nèi)存中的值。

三、樂(lè)觀(guān)鎖的使用場(chǎng)景

樂(lè)觀(guān)鎖適用于多讀少寫(xiě)的數(shù)據(jù)訪(fǎng)問(wèn)場(chǎng)景,例如讀取在線(xiàn)用戶(hù)列表、讀取商品庫(kù)存等。在這些場(chǎng)景下,讀操作的頻率遠(yuǎn)高于寫(xiě)操作的頻率,使用樂(lè)觀(guān)鎖可以提高數(shù)據(jù)庫(kù)的并發(fā)性能。

同時(shí),在數(shù)據(jù)更新操作的事務(wù)控制機(jī)制中,樂(lè)觀(guān)鎖也可以發(fā)揮重要的作用。當(dāng)使用樂(lè)觀(guān)鎖對(duì)于重要數(shù)據(jù)行進(jìn)行更新操作時(shí),如果事務(wù)能夠順利完成,則表示數(shù)據(jù)一致性得到了有效保障。

四、樂(lè)觀(guān)鎖的優(yōu)勢(shì)和缺點(diǎn)

樂(lè)觀(guān)鎖的主要優(yōu)勢(shì)在于其輕量級(jí)的特性,可以避免悲觀(guān)鎖的阻塞和并發(fā)低效,提高程序的并發(fā)性能,適用于高并發(fā)數(shù)據(jù)訪(fǎng)問(wèn)場(chǎng)景。同時(shí),樂(lè)觀(guān)鎖還能有效降低在數(shù)據(jù)更新時(shí)出現(xiàn)死鎖等并發(fā)問(wèn)題的概率。

然而,樂(lè)觀(guān)鎖的缺點(diǎn)也是顯而易見(jiàn)的。由于其基于版本控制機(jī)制實(shí)現(xiàn),數(shù)據(jù)更新操作的失敗率高于悲觀(guān)鎖,因此,其一般適用于少量數(shù)據(jù)的修改操作。由于實(shí)現(xiàn)方式的差異,CAS機(jī)制的實(shí)現(xiàn)復(fù)雜度較高,對(duì)于開(kāi)發(fā)者的代碼能力也有一定的要求,而使用版本字段機(jī)制需要對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行修改,不適合某些已有數(shù)據(jù)結(jié)構(gòu)的場(chǎng)景。

五、

在Java數(shù)據(jù)庫(kù)開(kāi)發(fā)中,樂(lè)觀(guān)鎖是一種實(shí)現(xiàn)輕量級(jí)鎖機(jī)制的有效方式。其基于版本控制機(jī)制實(shí)現(xiàn),避免了悲觀(guān)鎖的阻塞和并發(fā)低效,同時(shí)能夠有效提高程序的并發(fā)性能,適用于多讀少寫(xiě)的數(shù)據(jù)訪(fǎng)問(wèn)場(chǎng)景。然而,在實(shí)現(xiàn)方式和適用場(chǎng)景上,樂(lè)觀(guān)鎖也存在一定的局限性,需要開(kāi)發(fā)者在實(shí)際開(kāi)發(fā)中進(jìn)行靈活應(yīng)用。

綜上所述,樂(lè)觀(guān)鎖是Java數(shù)據(jù)庫(kù)開(kāi)發(fā)中一種值得掌握的技術(shù)。希望本篇文章能夠?qū)δ斫鈽?lè)觀(guān)鎖的應(yīng)用和實(shí)現(xiàn)原理有所幫助。

相關(guān)問(wèn)題拓展閱讀:

  • 樂(lè)觀(guān)鎖的示例
  • 深入研究 Java Synchronize 和 Lock 的區(qū)別與用法

樂(lè)觀(guān)鎖的示例

如一個(gè)金融系統(tǒng),當(dāng)某個(gè)操作員讀取用戶(hù)的數(shù)據(jù),并在讀出的用戶(hù)數(shù)據(jù)的基礎(chǔ)上進(jìn)行修改時(shí)(如更改用戶(hù)帳戶(hù)余額),如果采用悲觀(guān)鎖機(jī)制,也就意味著整個(gè)操作過(guò) 程中(從操作員讀出數(shù)據(jù)、開(kāi)始修改直至提交修改結(jié)果的全過(guò)程,甚至還包括操作 員中途去煮咖啡的時(shí)間),數(shù)據(jù)庫(kù)記錄始終處于加鎖狀態(tài),可以想見(jiàn),如果面對(duì)幾百上千個(gè)并發(fā),這樣的情況將導(dǎo)致怎樣的后果。

樂(lè)觀(guān)鎖機(jī)制在一定程度上解決了這個(gè)問(wèn)題。樂(lè)觀(guān)鎖,大多是基于數(shù)據(jù)版本 ( Version )記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫(kù)表的版本解決方案中,一般是通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè) “version” 字段來(lái)實(shí)現(xiàn)。

讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過(guò)期數(shù)據(jù)。

對(duì)于上面修改用戶(hù)鬧鎮(zhèn)帳戶(hù)信息的例子而言,假設(shè)數(shù)據(jù)庫(kù)中帳戶(hù)信息表中有一個(gè) version 字段,當(dāng)前值為 1 ;而當(dāng)前帳戶(hù)余額字段( balance )為 $100 。

1 操作員 A 此時(shí)將其讀出( version=1 ),并從其帳戶(hù)余額中扣除 $50( $100-$50 )。

2 在操作員 A 操作的過(guò)程中,操作員B 也讀入此用戶(hù)信息( version=1 ),并從其帳戶(hù)余額中扣除 $20 ( $100-$20 )。

3 操作員 A 完成了修改工作,將數(shù)據(jù)版本號(hào)加一( version=2 ),連兄簡(jiǎn)同帳戶(hù)扣除后余額( balance=$50 ),提交至數(shù)據(jù)庫(kù)更新,此時(shí)由于提交數(shù)據(jù)版本大于數(shù)據(jù)庫(kù)記錄當(dāng)前版本,數(shù)據(jù)被更新,數(shù)據(jù)庫(kù)記錄 version 更新為 2 。

4 操作員 B 完成了操作,也將版本號(hào)加一( version=2 )試圖向數(shù)據(jù)庫(kù)提交數(shù)據(jù)( balance=$80 ),但此時(shí)比對(duì)數(shù)據(jù)庫(kù)記錄版本時(shí)發(fā)現(xiàn),操作員 B 提交的數(shù)據(jù)版本號(hào)為 2 ,數(shù)據(jù)庫(kù)記錄當(dāng)前版本也為 2 ,不滿(mǎn)足 “ 提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新液塵粗 “ 的樂(lè)觀(guān)鎖策略,因此,操作員 B 的提交被駁回。

這樣,就避免了操作員 B 用基于 version=1 的舊數(shù)據(jù)修改的結(jié)果覆蓋操作員A 的操作結(jié)果的可能。

深入研究 Java Synchronize 和 Lock 的區(qū)別與用法

一、synchronized和lock的用法區(qū)別

synchronized:在需要同步的對(duì)象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號(hào)中表示需要鎖的對(duì)象。

lock:需要顯示指定起始位置和終止位置。一般使用ReentrantLock類(lèi)做為鎖,多個(gè)線(xiàn)程中必須要使用一個(gè)ReentrantLock類(lèi)做為對(duì)象才能保證鎖的生效。且在加鎖和解鎖處需要通過(guò)lock()和unlock()顯示指出。所以一般會(huì)在finally塊中寫(xiě)unlock()以防死鎖。

二、synchronized和lock性能區(qū)別

synchronized是托管給JVM執(zhí)行的,而lock是java寫(xiě)的控制鎖的代碼。在Java1.5中,synchronize是性能低效的。因?yàn)檫@是一個(gè)重量級(jí)操作,需要調(diào)用操作接口,導(dǎo)致有可能加鎖消耗的系統(tǒng)時(shí)間比加鎖以外的操作還多。相比之下使用Java提供的Lock對(duì)象,性能更高一些。但是到了Java1.6,發(fā)生了變化。synchronize在語(yǔ)義上很清晰,可以進(jìn)行很多優(yōu)化,有適應(yīng)自旋,鎖消除,鎖粗化,輕量級(jí)鎖,偏向鎖等等。導(dǎo)致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他們也更支持synchronize,在未來(lái)的版本中還有優(yōu)化余地。synchronized原始采用的是CPU悲觀(guān)鎖機(jī)制,即線(xiàn)野老程獲得的是獨(dú)占鎖。獨(dú)占鎖意味著其他線(xiàn)程只能依靠阻塞來(lái)等待線(xiàn)程釋放鎖。而在CPU轉(zhuǎn)換線(xiàn)程阻塞時(shí)會(huì)引起線(xiàn)程上下文切換,當(dāng)有很多線(xiàn)程競(jìng)爭(zhēng)鎖的時(shí)候,會(huì)引起CPU頻繁的上下文切換導(dǎo)致效率很低。而Lock用的是樂(lè)觀(guān)鎖方式。所謂樂(lè)觀(guān)鎖就是,每次不加鎖而敏脊帶是假設(shè)沒(méi)有沖突而去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試,直到成功為止。樂(lè)觀(guān)鎖實(shí)現(xiàn)的機(jī)制就是CAS操作(Compare and Swap)。可以進(jìn)一步研究ReentrantLock的源代碼,會(huì)發(fā)現(xiàn)其中比較重要的獲得鎖的一個(gè)方法是compareAndSetState。這里其實(shí)就是調(diào)用的CPU提供的特殊指令?,F(xiàn)代的CPU提供了指令,可以自動(dòng)更新共享數(shù)據(jù),而且能夠檢測(cè)到其他線(xiàn)程的干擾,而 compareAndSet() 就用這些代替了鎖定。這個(gè)算法稱(chēng)作非阻橋蘆塞算法,意思是一個(gè)線(xiàn)程的失敗或者掛起不應(yīng)該影響其他線(xiàn)程的失敗或掛起的算法。

Synchronize 使用簡(jiǎn)單,而且不需要釋放鎖,自己出了同步塊會(huì)釋放

Lock 使用麻煩。每次lock后,記得手工釋放。

在jdk 1.6之前 Synchronize 性能比Lock差很多森枝漏。jdk 1.6后就差不此爛多了。

Lock還可以實(shí)現(xiàn)定時(shí)等待,搭枝響應(yīng)中斷,等高級(jí)功能,有助于 避免死鎖。Synchronize 就不行了。

關(guān)于java 數(shù)據(jù)庫(kù)的樂(lè)觀(guān)鎖的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽(yáng)、重慶、貴陽(yáng)機(jī)房服務(wù)器托管租用。


當(dāng)前文章:Java數(shù)據(jù)庫(kù)中的樂(lè)觀(guān)鎖簡(jiǎn)介 (java 數(shù)據(jù)庫(kù)的樂(lè)觀(guān)鎖)
轉(zhuǎn)載源于:http://m.5511xx.com/article/cohghdc.html