java - lock與synchronize的解鎖順序問題?
問題描述
在學(xué)習(xí)lock與synchronize的區(qū)別時(shí),看到這樣一句話:“ lock更靈活,可以自由定義多把鎖的枷鎖解鎖順序(synchronized要按照先加的后解順序)”。請問這里:
1.lock的自由定義多把鎖的枷鎖解鎖順序怎么理解?2.synchronized要按照先加的后解順序怎么理解?
謝謝各位!
問題解答
回答1:Lock是一個(gè)接口,最常用的實(shí)現(xiàn)是 ReentrantLock,它的一個(gè)靈活之處是可以設(shè)定fair參數(shù)。
synchronized 和fair=false的ReentrantLock 無法決定加鎖順序。換句話說,線程A、B、C都要鎖定對象,嘗試鎖定的時(shí)間是A最早、然后是B,最后是C,那么當(dāng)A解鎖對象時(shí),不能確定到底B還是C接下來鎖定對象。
如果用fair=true的ReentrantLock(公平鎖),情況就確定了:A解鎖對象時(shí),由于B比C先嘗試鎖定對象,所以接下來一定是B來鎖定,只有當(dāng)B解鎖時(shí)才輪到C。
回答2:new lock1new lock2lock1.lock();lock2.lock();...lock2.unlock();lock1.unlock();
Lock的加解鎖是在java語義層面上實(shí)現(xiàn)的,鎖之間沒有必然關(guān)系
synchronized(obj1){ synchronized(obj2){... }}
synchronized加解鎖是由JVM來實(shí)現(xiàn),在執(zhí)行完synchronized塊后自行解鎖,所有會(huì)按照synchronized的嵌套順序解鎖。
相關(guān)文章:
1. objective-c - 微信快捷發(fā)送最近一張圖片是如何實(shí)現(xiàn)的?2. 子查詢 - mysql如何把多行數(shù)據(jù)合并到一行的多列中3. mysql如何判斷數(shù)據(jù)不存在則插入呢?4. 導(dǎo)入數(shù)據(jù)庫不成功5. mysql - 關(guān)于數(shù)據(jù)緩存策略方面的疑惑6. mysql如何配置遠(yuǎn)程php外網(wǎng)鏈接數(shù)據(jù)庫7. 老師 我是一個(gè)沒有學(xué)過php語言的準(zhǔn)畢業(yè)生 我希望您能幫我一下8. mysql 5萬張表 導(dǎo)出成sql 不要內(nèi)容,只要結(jié)構(gòu),非常慢。如何解決啊?9. PHP單例模式10. 數(shù)據(jù)庫 - mysql中有沒查看數(shù)據(jù)大小的函數(shù)??
