欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
一篇好文,帶你深入了解Lock鎖 !
1.為什么需要Lock
為什么synchronized不夠用,還需要Lock
Lock和synchronized這兩個(gè)最常見(jiàn)的鎖都可以達到線(xiàn)程安全的目的,但是功能上有很大不同。
Lock并不是用來(lái)代替synchronized的而是當使用synchronized不滿(mǎn)足情況或者不合適的時(shí)候來(lái)提供高級功能的
2.    為什么synchronized不夠用
效率低:鎖的釋放情況較少,試圖獲得鎖不能設定超時(shí),不能中斷一個(gè)正在試圖獲得鎖的線(xiàn)程
不夠靈活:加鎖和釋放的時(shí)候單一,每個(gè)鎖僅有單一的條件可能是不夠的
無(wú)法知道是否成功的獲取鎖
2.Lock鎖的意義
與使用synchronized方法和語(yǔ)句相比, Lock實(shí)現提供了更廣泛的鎖操作。 它們允許更靈活的結構,可以具有完全不同的屬性,并且可以支持多個(gè)關(guān)聯(lián)的Condition對象。
鎖是一種用于控制多個(gè)線(xiàn)程對共享資源的訪(fǎng)問(wèn)的工具。 通常,鎖提供對共享資源的獨占訪(fǎng)問(wèn),一次只能有一個(gè)線(xiàn)程可以獲取該鎖,并且對共享資源的所有訪(fǎng)問(wèn)都需要首先獲取該鎖。 但是,某些鎖可能允許并發(fā)訪(fǎng)問(wèn)共享資源,例如ReadWriteLock的讀取鎖。
使用synchronized方法或語(yǔ)句可訪(fǎng)問(wèn)與每個(gè)對象關(guān)聯(lián)的隱式監視器鎖,但會(huì )強制所有鎖的獲取和釋放以塊結構方式進(jìn)行。當獲取多個(gè)鎖時(shí),它們必須以相反的順序釋放鎖。
雖然用于synchronized方法和語(yǔ)句的作用域機制使使用監視器鎖的編程變得更加容易,并且有助于避免許多常見(jiàn)的涉及鎖的編程錯誤,但在某些情況下,您需要以更靈活的方式使用鎖。 例如,某些用于遍歷并發(fā)訪(fǎng)問(wèn)的數據結構的算法需要使用“移交”或“鏈鎖”:您獲取節點(diǎn)A的鎖,然后獲取節點(diǎn)B的鎖,然后釋放A并獲取C,然后釋放B并獲得D等。 Lock接口的實(shí)現通過(guò)允許在不同范圍內獲取和釋放鎖,并允許以任意順序獲取和釋放多個(gè)鎖,從而啟用了此類(lèi)技術(shù)。
3.鎖的用法
靈活性的提高帶來(lái)了額外的責任。 缺少塊結構鎖定需要手動(dòng)的去釋放鎖。 在大多數情況下,應使用以下慣用法:
Lock lock = new ReentrantLock();lock.lock();try{
}finally {  lock.unlock();}
當鎖定和解鎖發(fā)生在不同的范圍內時(shí),必須小心以確保通過(guò)try-finally或try-catch保護持有鎖定時(shí)執行的所有代碼,以確保在必要時(shí)釋放鎖定。
Lock實(shí)現通過(guò)使用非阻塞嘗試獲取鎖( tryLock() ),嘗試獲取可被中斷的鎖( lockInterruptibly以及嘗試獲取鎖),提供了比使用synchronized方法和語(yǔ)句更多的功能??赡軙?huì )超時(shí)( tryLock(long, TimeUnit) )。
Lock類(lèi)還可以提供與隱式監視器鎖定完全不同的行為和語(yǔ)義,例如保證順序,不可重用或死鎖檢測。 如果實(shí)現提供了這種特殊的語(yǔ)義,則實(shí)現必須記錄這些語(yǔ)義。
請注意, Lock實(shí)例只是普通對象,它們本身可以用作synchronized語(yǔ)句中的目標。 獲取Lock實(shí)例的監視器鎖與調用該實(shí)例的任何lock方法沒(méi)有指定的關(guān)系。 建議避免混淆,除非在自己的實(shí)現中使用,否則不要以這種方式使用Lock實(shí)例。
4.內存同步
所有Lock實(shí)現必須強制執行與內置監視器鎖所提供的相同的內存同步語(yǔ)義,如Java語(yǔ)言規范中所述 :
一個(gè)成功的lock操作具有同樣的內存同步效應作為一個(gè)成功的鎖定動(dòng)作。
一個(gè)成功的unlock操作具有相同的存儲器同步效應作為一個(gè)成功的解鎖動(dòng)作。
不成功的鎖定和解鎖操作以及可重入的鎖定/解鎖操作不需要任何內存同步效果。
實(shí)施注意事項
鎖獲取的三種形式(可中斷,不可中斷和定時(shí))在其性能特征可能有所不同。 此外,在給定的Lock類(lèi)中,可能無(wú)法提供中斷正在進(jìn)行的鎖定的功能。 因此,不需要為所有三種形式的鎖獲取定義完全相同的保證或語(yǔ)義的實(shí)現,也不需要支持正在進(jìn)行的鎖獲取的中斷。 需要一個(gè)實(shí)現來(lái)清楚地記錄每個(gè)鎖定方法提供的語(yǔ)義和保證。 在支持鎖獲取中斷的范圍內,它還必須服從此接口中定義的中斷語(yǔ)義:全部或僅在方法輸入時(shí)才這樣做。
5.Lock提供的接口
5.1 獲取鎖
void lock(); // 獲取鎖。
最普通的的獲取鎖,如果鎖被其他線(xiàn)程獲取則進(jìn)行等待
lock不會(huì )像synchronized一樣在異常的時(shí)候自動(dòng)釋放鎖
因此必須在finally中釋放鎖,以保證發(fā)生異常的時(shí)候鎖一定被釋放
注意:lock()方法不能被中斷,這會(huì )帶來(lái)很大的隱患:一旦陷入死鎖、lock()就會(huì )陷入永久等待狀態(tài)
5.2 獲取中斷鎖
void lockInterruptibly() throws InterruptedException;
除非當前線(xiàn)程被中斷,否則獲取鎖。
獲取鎖(如果有)并立即返回。
如果該鎖不可用,則出于線(xiàn)程調度目的,當前線(xiàn)程將被掛起,并在發(fā)生以下兩種情況之一之前處于休眠狀態(tài):
該鎖是由當前線(xiàn)程獲取的;
其他一些線(xiàn)程中斷當前線(xiàn)程,并支持鎖定獲取的中斷。
如果當前線(xiàn)程:在進(jìn)入此方法時(shí)已設置其中斷狀態(tài);要么獲取鎖時(shí)被中斷,并且支持鎖獲取的中斷,然后拋出InterruptedException并清除當前線(xiàn)程的中斷狀態(tài)。
注意事項
在某些實(shí)現中,中斷鎖獲取的能力可能是不可能的,并且如果可能的話(huà)可能是昂貴的操作。 程序員應意識到可能是這種情況。 在這種情況下,實(shí)現應記錄在案。與正常方法返回相比,實(shí)現可能更喜歡對中斷做出響應。Lock實(shí)現可能能夠檢測到鎖的錯誤使用,例如可能導致死鎖的調用,并且在這種情況下可能引發(fā)(未經(jīng)檢查的)異常。
注意 synchronized 在獲取鎖時(shí)是不可中斷的
5.3 嘗試獲取鎖
boolean tryLock();
非阻塞獲取鎖(如果有)并立即返回true值。 如果鎖不可用,則此方法將立即返回false值。相比于Lock這樣的方法顯然功能更加強大,我們可以根據是否能獲取到鎖來(lái)決定后續程序的行為
注意:該方法會(huì )立即返回,即便在拿不到鎖的時(shí)候也不會(huì )在一只在那里等待
該方法的典型用法是:
Lock lock = new ReentrantLock();if(lock.tryLock()){  try{    // TODO  }finally {    lock.unlock();  }}else{  // TODO}
5.4 在一定時(shí)間內獲取鎖
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
如果線(xiàn)程在給定的等待時(shí)間內獲取到鎖,并且當前線(xiàn)程尚未中斷,則獲取該鎖。
如果鎖可用,則此方法立即返回true值。 如果該鎖不可用,則出于線(xiàn)程調度目的,當前線(xiàn)程將被掛起,并處于休眠狀態(tài),直到發(fā)生以下三種情況之一:
該鎖是由當前線(xiàn)程獲取的。
其他一些線(xiàn)程會(huì )中斷當前線(xiàn)程,并支持鎖定獲取的中斷。
經(jīng)過(guò)指定的等待時(shí)間如果獲得了鎖,則返回值true 。
如果經(jīng)過(guò)了指定的等待時(shí)間,則返回值false 。 如果時(shí)間小于或等于零,則該方法將根本不等待。
注意事項
在某些實(shí)現中,中斷鎖獲取的能力可能是不可能的,并且如果可能的話(huà)可能是昂貴的操作。 程序員應意識到可能是這種情況。 在這種情況下,實(shí)現應記錄在案。與正常方法返回或報告超時(shí)相比,實(shí)現可能更喜歡對中斷做出響應。Lock實(shí)現可能能夠檢測到鎖的錯誤使用,例如源碼交易可能導致死鎖的調用,并且在這種情況下可能引發(fā)(未經(jīng)檢查的)異常。
5.5 解鎖
void unlock(); //釋放鎖。
注意事項
Lock實(shí)現通常會(huì )限制哪些線(xiàn)程可以釋放鎖(通常只有鎖的持有者才能釋放鎖),并且如果違反該限制,則可能引發(fā)(未經(jīng)檢查的)異常。
5.6 獲取等待通知組件
Condition newCondition(); //返回綁定到此Lock實(shí)例的新Condition實(shí)例。
該組件與當前鎖綁定,當前線(xiàn)程只有獲得了鎖。 才能調用該組件的wait()方法,而調用后,當前線(xiàn)程將釋放鎖。
注意事項
Condition實(shí)例的確切操作取決于Lock實(shí)現。
5.7總結
Lock對象鎖還提供了synchronized所不具備的其他同步特性,如可中斷鎖的獲取(synchronized在等待獲取鎖時(shí)是不可中斷的),超時(shí)中斷鎖的獲取,等待喚醒機制的多條件變量Condition等,這也使得Lock鎖具有更大的靈活性。Lock的加鎖和釋放鎖和synchronized有同樣的內存語(yǔ)義,也就是說(shuō)下一個(gè)線(xiàn)程加鎖后可以看到前一個(gè)線(xiàn)程解鎖前發(fā)生的所有操作。
6.鎖的分類(lèi)
根據一下6種情況可以區分多種不同的鎖,下面詳細介紹
6.1要不要鎖住同步資源
是否鎖住
鎖名稱(chēng)
實(shí)現方式
例子
鎖柱
悲觀(guān)鎖
synchronized、lock
synchronized、lock
不鎖住
樂(lè )觀(guān)鎖
CAS算法
原子類(lèi)、并發(fā)容器
悲觀(guān)鎖又稱(chēng)互斥同步鎖,互斥同步鎖的劣勢:
阻塞和喚醒帶來(lái)的性能劣勢
永久阻塞:如果持有鎖的線(xiàn)程被永久阻塞,比如遇到了無(wú)限循環(huán),死鎖等活躍性問(wèn)題
優(yōu)先級反轉
悲觀(guān)鎖:
當一個(gè)線(xiàn)程拿到鎖了之后其他線(xiàn)程都不能得到這把鎖,只有持有鎖的線(xiàn)程釋放鎖之后才能獲取鎖。
樂(lè )觀(guān)鎖:
自己才進(jìn)行操作的時(shí)候并不會(huì )有其他的線(xiàn)程進(jìn)行干擾,所以并不會(huì )鎖住對象。在更新的時(shí)候,去對比我在修改期間的數據有沒(méi)有人對他進(jìn)行改過(guò),如果沒(méi)有改變則進(jìn)行修改,如果改變了那就是別人改的那我就不改了放棄了,或者重新來(lái)。
開(kāi)銷(xiāo)對比:
悲觀(guān)鎖的原始開(kāi)銷(xiāo)要高于樂(lè )觀(guān)鎖,但是特點(diǎn)是一勞永逸,臨界區持鎖的時(shí)間哪怕越來(lái)越長(cháng),也不會(huì )對互斥鎖的開(kāi)銷(xiāo)造成影響
悲觀(guān)鎖一開(kāi)始的開(kāi)銷(xiāo)比樂(lè )觀(guān)鎖小,但是如果自旋時(shí)間長(cháng),或者不停的重試,那么消耗的資源也會(huì )越來(lái)越多
使用場(chǎng)景:
悲觀(guān)鎖:適合并發(fā)寫(xiě)多的情況,適用于臨界區持鎖時(shí)間比較長(cháng)的情況,悲觀(guān)鎖可以避免,大量的無(wú)用自旋等消耗
樂(lè )觀(guān)鎖:適合并發(fā)讀比較多的場(chǎng)景,不加鎖能讓讀取性能大幅度提高
6.2能否共享一把鎖
是否共享
鎖名稱(chēng)
可以
共享鎖(讀鎖)
不可以
排他鎖(獨占鎖)
共享鎖:
獲取共享鎖之后,可以查看但是無(wú)法修改和刪除數據,其他線(xiàn)程此時(shí)也可以獲取到共享鎖也可以查看但無(wú)法修改和刪除數據
案例:ReentrantReadWriteLock的讀鎖(具體實(shí)現后續系列文章會(huì )講解)
排他鎖:
獲取排他鎖的之后,別的線(xiàn)程是無(wú)法獲取當前鎖的,比如寫(xiě)鎖。
案例:ReentrantReadWriteLock的寫(xiě)鎖(具體實(shí)現后續系列文章會(huì )講解)
6.3是否排隊
是否排隊
鎖名稱(chēng)
排隊
公平鎖
不排隊
非公平鎖
非公平鎖:
先嘗試插隊,插隊失敗再排隊,非公平是指不完全的按照請求的順序,在一定的情況下可以進(jìn)行插隊
存在的意義:
提高效率
避免喚醒帶來(lái)的空檔期
案例:
以ReentrantLock為例,創(chuàng )建對象的時(shí)候參數為false(具體實(shí)現后續系列文章會(huì )講解)
針對tryLock()方法,它是不遵守設定的公平的規則的
例如:當有線(xiàn)程執行tryLock的時(shí)候一旦有線(xiàn)程釋放了鎖,那么這個(gè)正在執行tryLock的線(xiàn)程立馬就能獲取到鎖即使在它之前已經(jīng)有其他線(xiàn)程在等待隊列中
公平鎖:
排隊,公平是指的是按照線(xiàn)程請求的順序來(lái)進(jìn)行分配鎖
案例:以ReentrantLock為例,創(chuàng )建對象的時(shí)候參數為true(具體實(shí)現后續系列文章會(huì )講解)
注意:
非公平也同樣不提倡插隊行為,這里指的非公平是指在合適的時(shí)機插隊,而不是盲目的插隊
優(yōu)缺點(diǎn):
非公平鎖:
優(yōu)勢:更快,吞吐量大
劣勢:有可能產(chǎn)生線(xiàn)程饑餓
公平鎖:
優(yōu)勢: 線(xiàn)程平等,每個(gè)線(xiàn)程按照順序都有執行的機會(huì )
劣勢:更慢,吞吐量更小
6.4 是否可以重復獲取同一把鎖
是否可以重入
鎖名稱(chēng)
可以
可重入鎖
不可以
不可重入鎖
案例:以ReentrantLock為例(具體實(shí)現后續系列文章會(huì )講解)
6.5是否可以被中斷
是否可以中斷
鎖名稱(chēng)
案例
可以
可中斷鎖
Lock是可中斷鎖(因為tryLock和lockInterruptibly都能響應中斷)
不可以
不可中斷鎖
Synchronized就是不可中斷鎖
6.6等鎖的過(guò)程
是否自旋
鎖名稱(chēng)
自旋鎖
阻塞鎖
使用場(chǎng)景:
自旋鎖一般用于多核的服務(wù)器,在并發(fā)度不是很高的情況下,比阻塞鎖效率高
自旋鎖適合臨界區比較短小的情況,否則如果臨界區很大,線(xiàn)程一旦拿到鎖,很久以后才會(huì )釋放那也不合適的,因為會(huì )浪費性能在自旋的時(shí)候
7.鎖優(yōu)化
7.1 虛擬機中帶的鎖優(yōu)化
自旋鎖
鎖消除
鎖粗化
這三種鎖優(yōu)化的方式在前一篇Synchronized文章種所有講解
7.2寫(xiě)代碼的時(shí)候鎖優(yōu)化
縮小同步代碼塊
盡量不鎖住方法
減少請求鎖的次數
避免人為制造熱點(diǎn)
鎖中盡量不要再包含鎖
選擇合適的鎖類(lèi)型或者合適的工具類(lèi)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JDK的鎖Synchronized、ReentrantLock與讀寫(xiě)鎖
系統梳理一下鎖
Synchronized和Lock的區別
Java并發(fā)編程:Lock
Java并發(fā)入門(mén)原理教程(五)
并發(fā)編程的鎖機制:synchronized和lock | Aoho''s Blog
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久