鎖類別的簡單介紹

2021-10-08 12:26:51 字數 1153 閱讀 2806

對任何資料類的操作持悲觀的態度,認為任何資料操作都會發生執行緒不安全的現象。所以對每乙個操作都會加上悲觀鎖。悲觀鎖的實現往往依靠資料庫提供的鎖機制。

任何資料操作在一般情況下是不會產生執行緒不安全的問題的,持樂觀的態度。其不會在資料操作前加鎖,這樣也就不會發生等待。樂觀鎖會在資料進行提交更新時再上鎖,再開始對資料進行檢測。通過一種類似cas的感覺,比較資料前後版本號version(自加字段)或者業務的狀態來判斷操作是否有效。

根據鎖的搶占機制,可以將鎖給分為公平鎖和非公平鎖。公平鎖指的是先到先得,非公平鎖指的是誰搶到歸誰。

reentrantlock提供了公平和非公平鎖的實現。

根據鎖能被單個執行緒占有還是多個執行緒占有來進行劃分。

獨佔鎖在任何時候保證只有乙個執行緒獲取到鎖,reentrantlock就是以獨佔的方式實現。多數寫的操作用獨佔鎖可以保證執行緒安全

共享鎖則可以由多個執行緒同時持有,比如readwritelock讀寫鎖,它允許乙個資源被多個執行緒執行讀操作。讀操作一般允許用共享鎖,讀並不會影響資料的一致性。

獨佔鎖是一種悲觀鎖。

共享鎖是一種樂觀鎖。

當乙個執行緒想要獲取其它執行緒的鎖時,會被阻塞,但如果該執行緒想要重新獲取自己已有的鎖,如果不被阻塞,則稱自己的這把鎖為可重入鎖。

synchronized內建鎖其實就是一把可重入鎖。

可重入鎖的原理,其實就是在鎖內維護乙個執行緒標示,從來標示該鎖目前被哪個執行緒占用,然後關聯乙個計數器,一開始計數器值為0,說明該鎖沒有被任何執行緒占用,當乙個執行緒占用該鎖後,計數器的值就會變為1,如果其他執行緒再來獲取該鎖,就會發現該鎖已經有擁有者了,阻塞而掛起。

但當獲取該鎖的執行緒發現再去獲取的鎖的執行緒是自己,則再對計數器+1,然後釋放鎖-1,等到計數器為0時,鎖的執行緒標示為null,則會喚醒之前處於掛起狀態的執行緒重新來競爭鎖。

因為乙個執行緒獲取不到鎖而被阻塞後,要被掛起。而這個掛起的過程,就是從使用者狀態切換到核心狀態,而獲取到鎖後,又要重新從核心狀態切換到使用者狀態,這樣的切換是十分浪費時間的。而自旋鎖,則是讓該執行緒在被阻塞後,並不馬上進入核心狀態,而是通過一定次數的嘗試獲取鎖,如果在這個次數內能獲取到鎖,則可以直接執行,如果獲取不到鎖,那麼還是只能老老實實切換到核心狀態。

這個嘗試的次數可以使用 -xx:preblockspinsh引數設定該值。

所以自旋鎖是用cpu的時間來換取執行緒阻塞和排程的開銷,但這些時間也可能被浪費掉。

類別的作用?

有時我們需要在乙個已經定義好的類中增加一些方法,而不想去重新寫該類。比如當 工程已經很大,量比較多,或者類中已經抱住很多方法,已經有其他 呼叫了該 類建立物件並使用該類的方法時,可以使用類別對該類的擴充新的方法。注意 類別只能擴充方法,而不能擴充成員變數。委託 舉例 委託 degegate 顧名思義...

類別的設計

1 先制定協定,再實作 2 優點 事前的規則使類別更完善 較佳的類別版本控制取向 使用起來較有彈性 3 使用介面制定協定 代表使用者端與伺服端之間的協定,不包含資料及任何實作的程式碼 程式碼易動時,使用介面,不需要改程式碼 不同的類別均支援相同的操作 使用介面輕易就可實作多型 使用ado.net的介...

資產類別的功能

用途 資產類別是結構化固定資產的最重要方法。可在系統中定義任意數量的資產類別。使用資產類別並根據企業要求來結構化資產。資產類別適用於所有公司 因此,資產類別目錄與客戶端中的所有公司 相關。當公司 具有不同的折舊表因而具有不同的折舊範圍時,情況也是如此。前提 在資產會計的定製中定義資產類別。選擇組織結...