區別:是否可以插隊(預設都是非公平鎖)
設定公平鎖: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 每次獲取資料的時候,都不會擔心資料被修改,所以每次獲取資料的時候都不會進行加鎖,但是在更新資料的時候需要判斷該資料是否被別人修改過。如果資料被其他執行緒修改,則不進行資料更新,如果資料沒有被其他執行緒修改,則進行資料更新。由於資料沒有進行加鎖,期間該資料可...