各種鎖的理解

2021-10-24 03:24:45 字數 2335 閱讀 8407

區別:是否可以插隊(預設都是非公平鎖)

設定公平鎖new reentrantlock(ture)

可以理解為:拿到外面的鎖就會獲得裡面的鎖

//synchronized

public

class

demo1

,"a").

start()

;new

thread((

)->

,"b").

start()

;}}class

phone

public

synchronized

void

call()

}

//lock

public

class

demo2

,"a").

start()

;new

thread((

)->

,"b").

start()

;}}class

phone2

catch

(exception e)

finally

}public

void

call()

catch

(exception e)

finally

}}

寫乙個自旋鎖

//自旋鎖

public

class

spinlockdemo

}//解鎖

public

void

myunlock()

}

測試

public

static

void

main

(string[

] args)

throws interruptedexception

catch

(exception e)

finally},

"t1").

start()

; timeunit.seconds.

sleep(1

);newthread((

)->

catch

(exception e)

finally},

"t2").

start()

;}

自我理解:為了提高併發效率,獲得更高的吞吐量,預設不會出現衝突,在讀取時做個標記,更改時根據標記判斷資料是否更改,更改則回滾,未更改在更改。(不會一直占用直到提交時才去鎖定)

樂觀併發控制的事務包括以下階段:

讀取:事務將資料讀入快取,這時系統會給事務分派乙個時間戳。

校驗:事務執行完畢後,進行提交。這時同步校驗所有事務,如果事務所讀取的資料在讀取之後又被其他事務修改,則產生衝突,事務被中斷回滾。

寫入:通過校驗階段後,將更新的資料寫入資料庫。

悲觀鎖就是在運算元據時,認為此操作會出現資料衝突,所以在進行每次操作時都要通過獲取鎖才能進行對相同資料的操作。

共享鎖

共享鎖指的就是對於多個不同的事務,對同乙個資源共享同乙個鎖。(悲觀鎖的一種)

排它鎖

排它鎖與共享鎖相對應,就是指對於多個不同的事務,對同乙個資源只能有一把鎖。

與共享鎖型別,在需要執行的語句後面加上for update就可以了

行鎖,由字面意思理解,就是給某一行加上鎖,也就是一條記錄加上鎖。

表鎖,和行鎖相對應,給這個表加上鎖。

死鎖是什麼

兩個物件互相爭搶對方的鎖

如:

public

class

deadlockdemo

}class

mythread

implements

runnable

@override

public

void

run(

)catch

(interruptedexception e)

synchronized

(lockb)}}

}

解決問題

1、使用jps -l定位程序號

2、使用jstack 程序號找到死鎖問題

理解MySql事務隔離機制 鎖以及各種鎖協議

一直以來對資料庫的事務隔離機制的理解總是停留在表面,其內容也是看一遍忘一邊。這兩天決定從原理上理解它,整理成自己的知識。查閱資料的過程中發現好多零碎的概念如果串起來足夠寫一本書,所以在這裡給自己梳理乙個脈絡,具體的內容參考引文或在網上搜一下。由於平時接觸最多的是mysql,所以文章中某些部分是mys...

MySQL的各種鎖

每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖 因為不擔心資料被修改 但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可以被其他執行緒進行讀寫...

mysql 的各種鎖

一 樂觀鎖 optimistic lock 每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可...