www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]Atitit.軟件與編程語言中的鎖機(jī)制原理?1. 用途 (Db,業(yè)務(wù)數(shù)據(jù)加鎖,并發(fā)操作加鎖。 22. 鎖得類型 32.1. 排它鎖 “互斥鎖?共享鎖?樂觀鎖與悲觀鎖?樂觀鎖: 32.2. 自旋鎖還

Atitit.軟件與編程語言中的鎖機(jī)制原理

?

1. 用途 (Db,業(yè)務(wù)數(shù)據(jù)加鎖,并發(fā)操作加鎖。 2

2. 鎖得類型 3

2.1. 排它鎖 “互斥鎖?共享鎖?樂觀鎖與悲觀鎖?樂觀鎖: 3

2.2. 自旋鎖還是信號(hào)量 3

2.3. -自動(dòng)釋放還是手動(dòng)釋放 3

2.4. 按照使用者 數(shù)據(jù)庫(kù)鎖 ?操作系統(tǒng)鎖 3

2.5. 按照外觀 u型鎖 一字鎖 月牙鎖 Synchronized??Monitor類 3

2.6. 按照工作原理 彈簧鎖 ?彈子鎖 3

2.7. 實(shí)現(xiàn)方式,語言方式與庫(kù)方式 3

2.8. 行級(jí)鎖?表級(jí)別鎖 根據(jù)鎖的粒度來區(qū)分 3

2.9. ?表級(jí)鎖:5種??共享鎖(SHARE)?排他(EXCLUSIVE) 悲觀鎖:?樂觀鎖: 4

2.10. PS:只有共享鎖與共享鎖相互兼容,共享鎖與排它鎖、排它鎖之間都互不兼容 7

2.11. 按照數(shù)據(jù)庫(kù)維度分類?共享鎖與排它鎖?更新鎖? 7

2.12. 按照思想維度分類?悲觀鎖?樂觀鎖 7

3. 鎖機(jī)制?提供的鎖類型以及加解鎖方法 8

3.1. Java的鎖機(jī)制 Synchronized?ReentrantLock?AtomicInteger 8

3.2. 使用 JDK1.5 提供的讀寫鎖(java.util.concurrent.locks.ReadWriteLock) 8

3.3. 4、使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 類 9

3.4. C# 鎖原理(Monitor類和lock關(guān)鍵詞 ReaderWriterLock 9

4. 鎖的實(shí)現(xiàn)機(jī)制 大多是基于數(shù)據(jù)版本versin記錄機(jī)制 9

4.1.1. 樂觀鎖另一種實(shí)現(xiàn)方式CAS 10

4.2. test and set”指令 10

4.3. 鎖內(nèi)存總線 10

4.4. 硬件層面,CPU提供了原子操作、關(guān)中斷、鎖內(nèi)存總線的機(jī)制 10

5. 加鎖與解鎖機(jī)制 11

5.1. 就像停車場(chǎng)出門被堵住,首先和對(duì)方協(xié)商 11

5.2. 找不到對(duì)方,或者聯(lián)系不上,然后找管理者拆除 11

5.3. 如果找不到管理者,自我拆除,或者退回等待 11

6. 不同數(shù)據(jù)庫(kù)鎖機(jī)制?mysql mssql 11

7. ?死鎖 12

7.1. 1、系統(tǒng)出現(xiàn)死鎖必然同時(shí)保持的四個(gè)必要條件: ? 12

7.2. 2、死鎖的 防止策略 : 12

7.3. 三、死鎖的避免( 簡(jiǎn)單應(yīng)用 ) 13

7.4. 3、銀行算法是怎樣避免死鎖的: 13

7.5. 四、死鎖的檢測(cè)( 領(lǐng)會(huì) ) 死鎖的檢測(cè) 14

7.6. 分布式鎖機(jī)制 15

8. Ref參考資料 15

8.1. 深入淺出Java并發(fā)包—鎖機(jī)制(一) - 一線天色 天宇星辰的日志 - 網(wǎng)易博客.html 16

8.2. 【Java線程】鎖機(jī)制:synchronized、Lock、Condition - Alpha's 學(xué)習(xí)筆記 - 博客頻道 - CSDN.NET.html 16

8.3. Java常用鎖機(jī)制簡(jiǎn)介 - hduhans - 博客園.html 16

8.4. 5天不再懼怕多線程——第二天 鎖機(jī)制 - 一線碼農(nóng) - 博客園.html 16

8.5. C# 多線程編程之鎖的使用【互斥鎖(lock)和讀寫鎖(ReadWriteLock)】 - C#編程語言程序開發(fā)技術(shù)文章_C#編程 - 紅黑聯(lián)盟.html 16

8.6. 鎖機(jī)制與原子操作 _第四篇_ - 逆心 - 博客園.html 16

8.7. 簡(jiǎn)單的JavaScript互斥鎖.html 16

8.8. Atitit。Cas機(jī)制 軟件開發(fā) 編程語言 無鎖機(jī)制 java c# php.docx 16

8.9. atititi.同步鎖機(jī)制 16

8.10. 數(shù)據(jù)庫(kù)鎖機(jī)制 - Tobi7 - 博客園.mhtml 16

8.11. Atitit.線程死鎖的解析and調(diào)試.docx 16

8.12. atitit.sql server2008 查詢死鎖and 解決.doc 17

8.13. Atitit gc資源釋放器死鎖解除器 適合于游戲引擎,數(shù)據(jù)庫(kù)釋放 爬蟲網(wǎng)絡(luò)連接釋放等.docx 17

8.14. atitit 數(shù)據(jù)庫(kù)死鎖處理總結(jié).txt 17

8.15. atitit 線程死鎖in cmd調(diào)用的解決方案.docx.txt 17

8.16. atitit 軟件運(yùn)行與資源占用可靠性原理(cpu,資源泄露,死鎖,崩潰的解決).docx.txt 17

8.17. atitit.sql server2008 查詢死鎖and 解決.doc 17

8.18. atitit.減少數(shù)據(jù)庫(kù)死鎖總結(jié)o91 ??fx.doc 17

8.19. atitit.提升穩(wěn)定性---hb 死鎖 ?jsp seselvet 多線程解決.txt 17

8.20. atitit.線程死鎖in cmd調(diào)用的解決方案.docx 17

8.21. Atitit.線程死鎖的解析and調(diào)試.docx 17

8.22. atitit。修改字段死鎖mssql.doc 17

8.23. atitti.測(cè)試支持----生成死鎖的表格.doc 17

?

1.?用途 (Db,業(yè)務(wù)數(shù)據(jù)加鎖,并發(fā)操作加鎖。

?

2.?鎖得類型? 2.1.?排它鎖 “互斥鎖?共享鎖?樂觀鎖與悲觀鎖?樂觀鎖:

?

2.2.?自旋鎖還是信號(hào)量 2.3.?-自動(dòng)釋放還是手動(dòng)釋放 2.4.?按照使用者 數(shù)據(jù)庫(kù)鎖 ?操作系統(tǒng)鎖 2.5.?按照外觀 u型鎖 一字鎖 月牙鎖 Synchronized??Monitor類 2.6.?按照工作原理 彈簧鎖 ?彈子鎖 2.7.?實(shí)現(xiàn)方式,語言方式與庫(kù)方式

Java.util.concurrent.lock?中的Lock?框架是鎖定的一個(gè)抽象,它允許把鎖定的實(shí)現(xiàn)作為 Java 類,而不是作為語言的特性來實(shí)現(xiàn)。這就為L(zhǎng)ock?的多種實(shí)現(xiàn)留下了空間,各種實(shí)現(xiàn)可能有不同的調(diào)度算法、性能特性或者鎖定語義。

Reen

2.8.?行級(jí)鎖?表級(jí)別鎖 根據(jù)鎖的粒度來區(qū)分

?

行級(jí)鎖。特點(diǎn):開鎖大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。適合于有大量按索引更新少量不同數(shù)據(jù),同時(shí)又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理系統(tǒng)。

2.9.??表級(jí)鎖:5種??共享鎖(SHARE)?排他(EXCLUSIVE) 悲觀鎖:?樂觀鎖:

?

? ?行共享 (ROW SHARE) – 禁止排他鎖定表,與行排他類似,區(qū)別是別的事務(wù)還可以在此表上加任何排他鎖。(除排他(exclusive)外)
? ?行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖,其他事務(wù)依然可以并發(fā)地對(duì)相同數(shù)據(jù)表執(zhí)行查詢,插入,更新,刪除操作,或?qū)Ρ韮?nèi)數(shù)據(jù)行加鎖的操作,但不能有其他的排他鎖(自身是可以的,沒發(fā)現(xiàn)有什么用)
? ?共享鎖(SHARE) - 鎖定表,對(duì)記錄只讀不寫,多個(gè)用戶可以同時(shí)在同一個(gè)表上應(yīng)用此鎖,在表沒有被任何DML操作時(shí),多個(gè)事務(wù)都可加鎖,但只有在僅一個(gè)事務(wù)加鎖的情況下只有此事務(wù)才能對(duì)表更新;當(dāng)表已經(jīng)被更新或者指定要更新時(shí)(select for update),任何事務(wù)都不能加此鎖了。
? ?共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖,在表沒有被任何DML操作時(shí),只有一個(gè)事務(wù)可以加鎖,可以更新,書上說別的事務(wù)可以使用select for update鎖定選中的數(shù)據(jù)行,可是實(shí)驗(yàn)后沒被驗(yàn)證。
? ?排他(EXCLUSIVE) –?限制最強(qiáng)的表鎖,僅允許其他用戶查詢?cè)摫淼男?。禁止修改和鎖定表

?

? ?行級(jí)鎖和表級(jí)鎖是根據(jù)鎖的粒度來區(qū)分的,行記錄,表都是資源,鎖是作用在這些資源上的。如果粒度比較小(比如行級(jí)鎖),可以增加系統(tǒng)的并發(fā)量但需要較大的系統(tǒng)開銷,會(huì)影響到性能,出現(xiàn)死鎖,,因?yàn)榱6刃t操作的鎖的數(shù)量會(huì)增加;如果作用在表上,粒度大,開銷小,維護(hù)的鎖少,不會(huì)出現(xiàn)死鎖,但是并發(fā)是相當(dāng)昂貴的,因?yàn)殒i定了整個(gè)表就限制了其它事務(wù)對(duì)這個(gè)表中其他記錄的訪問。

? ?悲觀鎖:

? ?Pessimistic Lock正如其名,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守悲觀態(tài)度,事務(wù)每次去操作數(shù)據(jù)的時(shí)候都假設(shè)有其他事務(wù)會(huì)修改需要訪問的數(shù)據(jù),所以在訪問之前都要求上鎖,行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖,因此,在整個(gè)數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制(也只有數(shù)據(jù)庫(kù)層提供的鎖機(jī)制才能 真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無法保證外部系 統(tǒng)不會(huì)修改數(shù)據(jù))。 一個(gè)典型的倚賴數(shù)據(jù)庫(kù)的悲觀鎖調(diào)用: select * from account where name=”Erica” for update 這條sql 語句鎖定了account 表中所有符合檢索條件(name=”Erica”)的記錄。 本次事務(wù)提交之前(事務(wù)提交時(shí)會(huì)釋放事務(wù)過程中的鎖),外界無法修改這些記錄。

? ? Hibernate悲歡鎖實(shí)現(xiàn):基于數(shù)據(jù)庫(kù)鎖機(jī)制

? ? ? ? ?Query q=Session.createQuery("select ?* from t_profit where amount>10000");

? ? ? ? ? q.setLockMode("Profit",LockMode.UPGRADE);//Profit是Profit類的別名

? ? ? ? ?List

? ? ? ?執(zhí)行的sql:select ....from t_profit where amount>10000 for update.hibernate的悲觀鎖通過數(shù)據(jù)庫(kù)的for update實(shí)現(xiàn)。

? ? ?LockMode.NONE:無鎖機(jī)制;

? ? ?LockMode.WRITE:insert,update記錄時(shí)自動(dòng)獲取悲觀鎖;

? ? ?LockMode.READ在讀取時(shí)自動(dòng)獲取悲觀鎖;

? ? ?LockMode.UPGRADE:利用數(shù)據(jù)庫(kù)的for update子句加鎖;

? ? ?LockMode.UPGRADE_NOWAIT:oracle特定實(shí)現(xiàn),用oracle的for update nowait子句加鎖

? 樂觀鎖:

? ?Optimistic Lock,和悲歡鎖相反,事務(wù)每次去操作數(shù)據(jù)之前,都假設(shè)其他事務(wù)不會(huì)修改這些需要訪問的數(shù)據(jù) ,所以 在訪問之前不要求上鎖,只是在進(jìn)行更新修改操作的時(shí)候判斷一下在訪問的期間有沒有其他人修改數(shù)據(jù) 了。它適用于多讀的應(yīng)用類型,沖突真的發(fā)生比較少的時(shí)候就比較好,這樣省去了開銷的開銷,可以提高吞吐量;但如果是真的經(jīng)常要發(fā)生沖突的,那每次還要去判斷進(jìn)行retry,反倒降低的性能,這個(gè)時(shí)候悲歡鎖比較好。數(shù)據(jù)庫(kù)如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖。

? ? ? ? ? 它的實(shí)現(xiàn)大多是基于數(shù)據(jù)版本versin記錄機(jī)制。舉個(gè)例子:

? ? ? ?1.利潤(rùn)表t_profit中有一個(gè) version字段,當(dāng)前值為1;而總資產(chǎn)余額字段(balance)為$10000

? ? ? ?2.操作員A讀出version=1,從總資產(chǎn)減除2000,10000-2000=8000.

? ? ? ?3.A還沒操作結(jié)束,此時(shí)操作員B也讀出version=1,總資產(chǎn)減除5000,10000-5000=5000.

? ? ? ?4.A操作完成,把version加1,修改為2,把總資產(chǎn)減2000后提交更新數(shù)據(jù)庫(kù),更新成功

? ? ? ?5.B操作了,也加version加1,修改為2,把總資產(chǎn)減5000后提交更新數(shù)據(jù)庫(kù),此時(shí)發(fā)現(xiàn)version已經(jīng)為2了,如B修改后加1的version一樣,不滿足樂觀鎖策略:"提交的版本必有大于記錄當(dāng)前的版本才能執(zhí)行"。因此B的操作請(qǐng)求被駁回,這樣就避免了B就version=1的舊數(shù)據(jù)修改的結(jié)果覆蓋了A操作的結(jié)果的可能。如沒有樂觀鎖,那A減去2000后剩余8000,但B操作的時(shí)候是用10000-5000剩余5000的,如果B的提交成功,總資產(chǎn)余額就是5000,但實(shí)際情況應(yīng)該是8000-5000=3000的。出現(xiàn)總資產(chǎn)表記錄和實(shí)際支出不一致。

? ? Hibernate對(duì)樂觀鎖的實(shí)現(xiàn):

? ? ?

? ? ? ?

? ? ?

·??共享鎖:用于不更改或不更新數(shù)據(jù)的操作(只讀操作)。共享鎖允許并發(fā)事務(wù)讀取同一個(gè)資源,數(shù)據(jù)資源上存在共享鎖時(shí),任何其他事務(wù)不允許修改數(shù)據(jù)

·?排它鎖:?用于數(shù)據(jù)修改,確保不會(huì)同時(shí)多重更新同一數(shù)據(jù)。資源上存在排他鎖時(shí),其他任何事務(wù)不允許給資源上鎖,當(dāng)資源上有其他鎖時(shí),也無法對(duì)其加上排它鎖

2.10.?PS:只有共享鎖與共享鎖相互兼容,共享鎖與排它鎖、排它鎖之間都互不兼容

·?更新鎖?

2.11.?按照數(shù)據(jù)庫(kù)維度分類?共享鎖與排它鎖?更新鎖?

?

2.12.?按照思想維度分類?悲觀鎖?樂觀鎖

?

·?悲觀鎖

1.?悲觀并發(fā)控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”)是一種并發(fā)控制的方法。它可以阻止一個(gè)事務(wù)以影響其他用戶的方式來修改數(shù)據(jù)。如果一個(gè)事務(wù)執(zhí)行的操作都某行數(shù)據(jù)應(yīng)用了鎖,那只有當(dāng)這個(gè)事務(wù)把鎖釋放,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制。悲觀并發(fā)控制主要用于數(shù)據(jù)爭(zhēng)用激烈的環(huán)境,以及發(fā)生并發(fā)沖突時(shí)使用鎖保護(hù)數(shù)據(jù)的成本要低于回滾事務(wù)的成本的環(huán)境中。

2.??悲觀并發(fā)控制實(shí)際上是“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證。但是在效率方面,處理加鎖的機(jī)制會(huì)讓數(shù)據(jù)庫(kù)產(chǎn)生額外的開銷,還有增加產(chǎn)生死鎖的機(jī)會(huì);另外,在只讀型事務(wù)處理中由于不會(huì)產(chǎn)生沖突,也沒必要使用鎖,這樣做只能增加系統(tǒng)負(fù)載;還有會(huì)降低了并行性,一個(gè)事務(wù)如果鎖定了某行數(shù)據(jù),其他事務(wù)就必須等待該事務(wù)處理完才可以處理那行數(shù)

·??樂觀鎖

1.?樂觀并發(fā)控制(又名“樂觀鎖”,Optimistic Concurrency Control,縮寫“OCC”)是一種并發(fā)控制的方法。它假設(shè)多用戶并發(fā)的事務(wù)在處理時(shí)不會(huì)彼此互相影響,各事務(wù)能夠在不產(chǎn)生鎖的情況下處理各自影響的那部分?jǐn)?shù)據(jù)。在提交數(shù)據(jù)更新之前,每個(gè)事務(wù)會(huì)先檢查在該事務(wù)讀取數(shù)據(jù)后,有沒有其他事務(wù)又修改了該數(shù)據(jù)。如果其他事務(wù)有更新的話,正在提交的事務(wù)會(huì)進(jìn)行回滾。

2.?樂觀并發(fā)控制相信事務(wù)之間的數(shù)據(jù)競(jìng)爭(zhēng)(data race)的概率是比較小的,因此盡可能直接做下去,直到提交的時(shí)候才去鎖定,所以不會(huì)主動(dòng)產(chǎn)生任何鎖和死鎖。但是在并發(fā)量高的情況下,可能導(dǎo)致某次數(shù)據(jù)修改多次重試,影響單次成功操作的時(shí)間。

3.?數(shù)據(jù)版本實(shí)現(xiàn)樂觀鎖:實(shí)現(xiàn)數(shù)據(jù)版本有兩種方式,第一種是使用版本號(hào),第二種是使用時(shí)間戳。使用版本號(hào)時(shí),可以在數(shù)據(jù)初始化時(shí)指定一個(gè)版本號(hào),每次對(duì)數(shù)據(jù)的更新操作都對(duì)版本號(hào)執(zhí)行+1操作。并判斷當(dāng)前版本號(hào)是不是該數(shù)據(jù)的最新的版本號(hào)。

?

3.?鎖機(jī)制?提供的鎖類型以及加解鎖方法

?

?

3.1.?Java的鎖機(jī)制 Synchronized?ReentrantLock?AtomicInteger

是基于JVM來保證數(shù)據(jù)同步的,而Lock則是在硬件層面,依賴特殊的CPU指令實(shí)現(xiàn)數(shù)據(jù)同步的

實(shí)際JDK中也是通過一個(gè)32bit的整數(shù)位進(jìn)行CAS操作來實(shí)現(xiàn)的。

?

需要注意的是,用sychronized修飾的方法或者語句塊在代碼執(zhí)行完之后鎖自動(dòng)釋放,而是用Lock需要我們手動(dòng)釋放鎖,所以為了保證鎖最終被釋放(發(fā)生異常情況),要把互斥區(qū)放在try內(nèi),釋放鎖放在finally內(nèi)?。?/p>

?

?Atomic* 開頭的類基本原理都是一致的, 都是借助了底層硬件級(jí)別的?Lock?來實(shí)現(xiàn)原子操作的。 Cas原理

?

3.2.?使用 JDK1.5 提供的讀寫鎖(java.util.concurrent.locks.ReadWriteLock)

代碼如下
rwlock.readLock().lock();?
value = map.get(key);?
rwlock.readLock().unlock();?
這樣兩個(gè)讀操作可以同時(shí)進(jìn)行,理論上效率會(huì)比方法 2 高。

3.3. 使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 類

。該類將 Map 的存儲(chǔ)空間分為若干塊,每塊擁有自己的鎖,大大減少了多個(gè)線程爭(zhēng)奪同一個(gè)鎖的情況。代碼如下
value = map.get(key); //同步機(jī)制內(nèi)置在 get 方法中

?

?

3.4.?C# 鎖原理(Monitor類和lock關(guān)鍵詞 ReaderWriterLock

C#提供了2種手工控制的鎖

一: ?Monitor類

? ? ?這個(gè)算是實(shí)現(xiàn)鎖機(jī)制的純正類,在鎖定的臨界區(qū)中只允許讓一個(gè)線程訪問,其他線程排隊(duì)等待。主要整理為2組方法。

?

1:Monitor.Enter和Monitor.Exit

微軟很照護(hù)我們,給了我們語法糖Lock,對(duì)的

?

2:ReaderWriterLock類

? ? 先前也知道,Monitor實(shí)現(xiàn)的是在讀寫兩種情況的臨界區(qū)中只可以讓一個(gè)線程訪問,那么如果業(yè)務(wù)中存在”讀取密集型“操作,就

好比數(shù)據(jù)庫(kù)一樣,讀取的操作永遠(yuǎn)比寫入的操作多。針對(duì)這種情況,我們使用Monitor的話很吃虧,不過沒關(guān)系,ReadWriterLock

就很牛X,因?yàn)閷?shí)現(xiàn)了”寫入串行“,”讀取并行“。

?

4.?鎖的實(shí)現(xiàn)機(jī)制 大多是基于數(shù)據(jù)版本versin記錄機(jī)制

?

它的實(shí)現(xiàn)大多是基于數(shù)據(jù)版本versin記錄機(jī)制。舉個(gè)例子:

? ? ? ?1.利潤(rùn)表t_profit中有一個(gè) version字段,當(dāng)前值為1;而總資產(chǎn)余額字段(balance)為$10000

? ? ? ?2.操作員A讀出version=1,從總資產(chǎn)減除2000,10000-2000=8000.

? ? ? ?3.A還沒操作結(jié)束,此時(shí)操作員B也讀出version=1,總資產(chǎn)減除5000,10000-5000=5000.

? ? ? ?4.A操作完成,把version加1,修改為2,把總資產(chǎn)減2000后提交更新數(shù)據(jù)庫(kù),更新成功

? ? ? ?5.B操作了,也加version加1,修改為2,把總資產(chǎn)減5000后提交更新數(shù)據(jù)庫(kù),此時(shí)發(fā)現(xiàn)version已經(jīng)為2了,如B修改后加1的version一樣,不滿足樂觀鎖策略:"提交的版本必有大于記錄當(dāng)前的版本才能執(zhí)行"。因此B的操作請(qǐng)求被駁回,這樣就避免了B就version=1的舊數(shù)據(jù)修改的結(jié)果覆蓋了A操作的結(jié)果的可能。如沒有樂觀鎖,那A減去2000后剩余8000,但B操作的時(shí)候是用10000-5000剩余5000的,如果B的提交成功,總資產(chǎn)余額就是5000,但實(shí)際情況應(yīng)該是8000-5000=3000的。出現(xiàn)總資產(chǎn)表記錄和實(shí)際支出不一致。

? ? Hibernate對(duì)樂觀鎖的實(shí)現(xiàn):

4.0. 樂觀鎖另一種實(shí)現(xiàn)方式CAS

CAS是項(xiàng)樂觀鎖技術(shù),當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí),只有其中一個(gè)線程能更新變量的值,而其它線程都失敗,失敗的線程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試。

CAS 操作包含三個(gè)操作數(shù) —— 內(nèi)存位置(V

4.1.?test and set”指令 4.2.?鎖內(nèi)存總線 4.3.?硬件層面,CPU提供了原子操作、關(guān)中斷、鎖內(nèi)存總線的機(jī)制

?

5.?加鎖與解鎖機(jī)制 5.1.?就像停車場(chǎng)出門被堵住,首先和對(duì)方協(xié)商 5.2.?找不到對(duì)方,或者聯(lián)系不上,然后找管理者拆除? 5.3.?如果找不到管理者,自我拆除,或者退回等待

?

6.?不同數(shù)據(jù)庫(kù)鎖機(jī)制?mysql mssql

DBMS

SELECT

UPDATE

INSERT

DELETE

MySQL(InnoDB)

不加鎖

排它鎖

排它鎖

排它鎖

SQL SERVER

共享鎖

更新鎖?

排它鎖

排它鎖

?

7.??死鎖 7.1. 系統(tǒng)出現(xiàn)死鎖必然同時(shí)保持的四個(gè)必要條件:

1)互斥使用資源


2)占有并等待資源


3)不可搶奪資源

4)循環(huán)等待資源

7.2. 死鎖的 防止策略 :

要防止死鎖形成,只要采用的資源分配策略能使上述4個(gè)條件中有一個(gè)條件不成立就可以了。

1)破壞互斥使用資源的條件經(jīng)常是行不通的。因?yàn)橘Y源本身特性就是互斥使用的。

2)要破壞“占有并等待條件”則可以采取兩種辦法: 靜態(tài)分配 和 釋放已占資源 .

  靜態(tài)分配 也稱為 預(yù)分配資源 ,要求每一個(gè)進(jìn)程在開始執(zhí)行前就申請(qǐng)它所需要的全部資源,僅當(dāng)系統(tǒng)能滿足進(jìn)程的資源申請(qǐng)要求且把資源分配給進(jìn)程后,該進(jìn)程才能開始執(zhí)行。

  釋放已占資源 就是指進(jìn)程申請(qǐng)資源時(shí)必須沒有占用資源,如果已經(jīng)占用了資源就要先歸還所占的資源再申請(qǐng)。

3)實(shí)現(xiàn) 可搶奪式分配 :如果一個(gè)進(jìn)程已經(jīng)占有了某些資源又要申請(qǐng)新資源,而新資源不能滿足(已被其它進(jìn)程占用)必須等待時(shí),系統(tǒng)可以搶奪該進(jìn)程已占有的資源。

4)實(shí)現(xiàn) 按序分配 :把系統(tǒng)中所有資源排一個(gè)順序,對(duì)每一個(gè)資源給一個(gè)確定的編號(hào),規(guī)定任何一個(gè)進(jìn)程申請(qǐng)兩個(gè)以上的資源時(shí),總是先申請(qǐng)編號(hào)小的資源,再申請(qǐng)編號(hào)大的資源。

7.3.?三、死鎖的避免( 簡(jiǎn)單應(yīng)用 )?

 死鎖的避免不同于死鎖的防止,死鎖的防止是采用某種分配策略后,系統(tǒng)就不會(huì)產(chǎn)生死鎖,這好比是你打過了某種預(yù)防針,再也不會(huì)得那種病。而死鎖的避免是沒有打預(yù)防針,但是通過其他辦法,避免得病。因此有“安全狀態(tài)”的說法,對(duì)應(yīng)的,當(dāng)然也有不安全狀態(tài)。就像人都有得病的可能,不必任何病都打預(yù)防針。只要注意防病,仍然可以安全健康的生活。

1、 安全狀態(tài) :如果操作系統(tǒng)能保證所有的進(jìn)程在 有限的時(shí)間 內(nèi)得到需要的 全部資源 ,則稱系統(tǒng)處于“安全狀態(tài)”。

2、區(qū)分死鎖的 避免 與死鎖的 防止 :當(dāng)采用了防止死鎖的資源分配策略后,系統(tǒng)中就不會(huì)形成死鎖。但是可以防止死鎖的資源分配策略中,有的只適用于對(duì)某些資源的分配,有的會(huì)影響資源的使用效率。這時(shí)可用使用死鎖的避免。

  死鎖的避免是解決死鎖的另一種方法,它不同于死鎖的防止。在系統(tǒng)中不采用防止死鎖的資源分配策略,而是估計(jì)到可能有死鎖發(fā)生時(shí)避免死鎖的發(fā)生。

7.4. 銀行算法是怎樣避免死鎖的:



  銀行家算法是這樣的:

1)當(dāng)一個(gè)用戶對(duì)資金的最大的需求量不超過銀行家現(xiàn)有的資金時(shí)就可以接納該用戶。

2)用戶可以分期貸款,但貸款的總數(shù)不能超過最大需求量。

3)當(dāng)銀行家現(xiàn)有的資金不能滿足用戶的尚需貸款時(shí),對(duì)用戶的貸款可推遲支付,但總能使用戶在有限的時(shí)間里得到貸款。

4)當(dāng)用戶得到所需的全部資金后,一定能在有限的時(shí)間里歸還所有資金。

  我們把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于是銀行家管理的資金,則銀行家算法就是:

1)當(dāng)一個(gè)進(jìn)程首次申請(qǐng)資源時(shí),測(cè)試該進(jìn)程對(duì)資源的最大的需求量,如果不超過系統(tǒng)現(xiàn)存資源時(shí)就可以按他的當(dāng)前申請(qǐng)量為其分配資源。 否則推遲分配。

2)進(jìn)程執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),測(cè)試該進(jìn)程占用資源和本次申請(qǐng)資源總數(shù)有沒有超過最大需求量。超過就不分配,沒超過則再測(cè)試現(xiàn)存資源是否滿足進(jìn)程還需要的最大資源量,滿足則按當(dāng)前申請(qǐng)量分配,否則也推遲分配。

  總之,銀行家算法要保證分配資源時(shí)系統(tǒng)現(xiàn)存資源一定能滿足至少一個(gè)進(jìn)程所需的全部資源。這樣就可以保證所有進(jìn)程都能在有限時(shí)間內(nèi)得到需要的全部資源。這就是安全狀態(tài)。

  (銀行家算法在操作系統(tǒng)的實(shí)踐考試中可能會(huì)用到)

7.5.?四、死鎖的檢測(cè)( 領(lǐng)會(huì) ) 死鎖的檢測(cè)



  就是既不打預(yù)防針,也不去避免得病,而是經(jīng)常去體檢,如果發(fā)現(xiàn)有病了就治療。這是一種事后解決的辦法,也算是解決死鎖問題的一條途徑。但這畢竟要付出較大代價(jià)。

1、什么是 死鎖的檢測(cè) :對(duì)資源的申請(qǐng)和分配不加限制,只要有剩余的資源就可把資源分配給申請(qǐng)者。這樣可能會(huì)出現(xiàn)死鎖,系統(tǒng)定時(shí)運(yùn)行一個(gè)“死鎖檢測(cè)程序”,如果檢測(cè)到死鎖發(fā)生,則必須先解除死鎖再繼續(xù)工作。

2、怎樣實(shí)現(xiàn)死鎖的檢測(cè):1、每個(gè)資源當(dāng)用中只有一個(gè)資源2、資源類中含有若干個(gè)資源。

3、 死鎖的解除 :一般采用兩種方式來解除死鎖,一種是終止一個(gè)或幾個(gè)進(jìn)程的執(zhí)行以破壞循環(huán)等待;另一種是從涉及死鎖的進(jìn)程中搶奪資源。

  檢測(cè)死鎖和解除死鎖都要付出很大代價(jià)。所以用死鎖檢測(cè)的方法解決死鎖問題只適用于 不經(jīng)常發(fā)生死鎖 的系統(tǒng)中。

?

?

?

窗體頂端




窗體底端


7.6.?分布式鎖機(jī)制

·?

·?a408308321

·?2016年09月06日 18:07

·?775

前言: ? ? ? 由于在平時(shí)的工作中,線上服務(wù)器是分

?

?

?

?

?

8.?Ref參考資料

?

?

8.1.?深入淺出Java并發(fā)包—鎖機(jī)制(一) 8.2.?【Java線程】鎖機(jī)制:synchronized、Lock、Condition 8.3.?Java常用鎖機(jī)制簡(jiǎn)介 8.4.?5天不再懼怕多線程——第二天 鎖機(jī)制 8.5.?C# 多線程編程之鎖的使用【互斥鎖(lock)和讀寫鎖(ReadWriteLock)】 - C#編程語言程序開發(fā)技術(shù)文章_C#編程8.6.?鎖機(jī)制與原子操作 _第四篇_8.7.?簡(jiǎn)單的JavaScript互斥鎖8.8.?Atitit。Cas機(jī)制 軟件開發(fā) 編程語言 無鎖機(jī)制8.9.?atititi.同步鎖機(jī)制 8.10.?數(shù)據(jù)庫(kù)鎖機(jī)制8.11.?Atitit.線程死鎖的解析and調(diào)試8.12.?atitit.sql server2008 查詢死鎖and 解決 8.13.?Atitit gc資源釋放器死鎖解除器 適合于游戲引擎,數(shù)據(jù)庫(kù)釋放 爬蟲網(wǎng)絡(luò)連接釋放等8.14.?atitit 數(shù)據(jù)庫(kù)死鎖處理總結(jié)8.15.?atitit 線程死鎖in cmd調(diào)用的解決方案 8.16.?atitit 軟件運(yùn)行與資源占用可靠性原理(cpu,資源泄露,死鎖,崩潰的解決)8.17.?atitit.sql server2008 查詢死鎖and 解決 8.18.?atitit.減少數(shù)據(jù)庫(kù)死鎖總結(jié)8.19.?atitit.提升穩(wěn)定性---hb 死鎖 ?jsp seselvet 多線程解決8.20.?atitit.線程死鎖in cmd調(diào)用的解決方案 8.21.?Atitit.線程死鎖的解析and調(diào)試 8.22.?atitit。修改字段死鎖mssql 8.23.?atitti.測(cè)試支持----生成死鎖的表格 8.24.?操作系統(tǒng)的鎖機(jī)制?

?

?


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉