其實常用也就那么幾個鎖,總感覺線程所用的鎖機制和數(shù)據(jù)庫的很相似,什么讀寫鎖,就和數(shù)據(jù)庫的共享鎖,排他鎖沒什么區(qū)別.甚至有的文章連名字都一樣,因為他們表達的含義是完全一樣,而且多說一句,mysql數(shù)據(jù)庫的鎖名字真他媽亂.下次好好分析一下.
下面看看線程的鎖
1.可重入鎖(重要)
這其實是一種屬性(可重入性),在線程中只要符合可重入性的鎖,都可被稱為可重入鎖.
可重入鎖是一個什么概念呢?
就是一個線程在執(zhí)行一個,比如被 synchronized 修飾的方法,這時他獲得了這個方法的鎖了,但是這個方法里面調(diào)用了另外一個被synchronized 修飾的方法,他可以直接獲取第二個方法的鎖,而無需等待.
這樣做好處是,預(yù)防死鎖,比如說,一個線程獲取了第一個方法的鎖,他還想獲取第二個方法的鎖,但需要申請,他有可能會永遠卡在這(萬一第二個被占用了呢),所以他會直接進入第二個方法,不需要獲取鎖,如果能滿足這一點他就是可重入鎖.常用的synchronized 和ReentrantLock(就是lock)都是可重入鎖.
但是,你發(fā)現(xiàn)了一個問題沒有,因為第二個方法的鎖不需要申請,所以如果有全局變量,就很有可能會出錯,所以滿足以下幾點很重要.
2.可中斷鎖
就是那種等待鎖的過程中,等半可以嫌時間太長不等的鎖
3.公平鎖
看下面總結(jié)來說就是少用synchronized 多用lock鎖(哈哈)
4.讀寫鎖(重要)
沒有感覺這和數(shù)據(jù)庫的鎖簡直一模一樣嗎,關(guān)鍵點就是只要有寫,就不行,就只能一個線程來操作.
讀寫互斥害怕出現(xiàn)臟讀(哈哈),線程中沒有臟讀這個概念哈(我不知道),我知道這是數(shù)據(jù)庫的概念
就是有寫的就不能共存,其實也很好理解.
下面看看示例
在下面試驗證過程,看看讀寫鎖的過程,可以看看
五.樂觀鎖與悲觀鎖
同樣這也都是一種概念哈,符合這個概念的就是樂觀鎖與悲觀鎖了
說的簡單點
悲觀鎖隨時加鎖,有一個線程調(diào)用鎖之后,其他線程就必須等待了.安全性很高,但效率肯定就不好了.
樂觀鎖:我覺得啊既然無法解決臟讀,那就肯定是可以隨時獲取鎖了.
而且啊,這些往往都要和數(shù)據(jù)庫來一起實現(xiàn),使用數(shù)據(jù)庫的機制來具體實現(xiàn)這些鎖機制.因為按他的說法如果不在數(shù)據(jù)庫進行處理,那么即使在系統(tǒng)中進行了鎖處理也不能很好的實現(xiàn).
而且剛好找到了數(shù)據(jù)庫的鎖的一些概念,剛好來看看
鄙人感覺這些鎖的概念和數(shù)據(jù)庫的鎖的概念幾乎是一樣的,只是應(yīng)該數(shù)據(jù)庫的鎖更為強力一點(也有可能是因為數(shù)據(jù)庫是最后一道防線了),反正所以在實現(xiàn)樂觀悲觀鎖的具體實現(xiàn)中用到了大量數(shù)據(jù)庫的機制.
總之和數(shù)據(jù)庫很相似,我知道的線程常用的鎖也就這么多了,下次再好好整理整理數(shù)據(jù)庫的鎖機制,好好對比一下.
其實感覺很多具體實現(xiàn)原理還都是不太懂,先把這些基礎(chǔ)搞好吧.