java - ReentrantLock和Synchronized
問(wèn)題描述
在資源競(jìng)爭(zhēng)不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競(jìng)爭(zhēng)很激烈的情況下,Synchronized的性能會(huì)下降幾十倍,但是ReetrantLock的性能能維持常態(tài)
(1)這個(gè)是為啥?(2)ReentrantLock是不是輕量級(jí)鎖? 輕量級(jí)鎖有哪些? 只聽(tīng)過(guò)這個(gè)名字,沒(méi)見(jiàn)過(guò)有具體實(shí)現(xiàn)
用synchronized時(shí)候,如果程序運(yùn)行出錯(cuò),就會(huì)拋出異常,但是不會(huì)去做清理工作。使用ReentrantLock允許你嘗試著獲取但最終未獲取的鎖,這樣如果其他人已經(jīng)獲得這個(gè)鎖,那你就可以離開(kāi)去執(zhí)行別的事情(但是我現(xiàn)在想做的事情的是獲取鎖之后進(jìn)行某些操作,現(xiàn)在轉(zhuǎn)而去執(zhí)行其他事情好像意義不太大呀),而不是等待直到這個(gè)鎖被釋放。
問(wèn)題解答
回答1:首先你說(shuō)的這個(gè)情況,是在java 1.5剛引入ReentrantLock的時(shí)候才有,java1.6對(duì)Synchronized的實(shí)現(xiàn)算法進(jìn)行了改造,與ReentrantLock的實(shí)現(xiàn)基本一致,所以倆者的性能差異已經(jīng)很小了。關(guān)于輕量級(jí)鎖,這是java1.6引入的提升鎖性能的一種方式,屬于jvm層級(jí)的,不存在什么具體實(shí)現(xiàn)。如果希望等待直到這個(gè)鎖被釋放,可以使用Lock.lock()獲得的方式獲得鎖,使用Lock.tryLock()才是在嘗試獲取可能獲取不到鎖。
回答2:可以簡(jiǎn)單一點(diǎn)的理解,synchronized 的讀寫(xiě)頁(yè)都是互斥的,但是 ReentrantLock 有讀寫(xiě)鎖,讀鎖可以共享,寫(xiě)鎖才互斥,如果從這里看的話 ReentrantLock 在讀多,寫(xiě)少的情況下性能會(huì)高不少,但是代碼比 synchronized 的復(fù)雜,如果控制不好也容易出問(wèn)題。
相關(guān)文章:
1. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?2. javascript - table列過(guò)多,有什么插件可以提供列排序和選擇顯示列的功能3. showpassword里的this 是什么意思?代表哪個(gè)元素4. javascript - windows下如何使用babel,遇到了困惑5. JavaScript事件6. python - 為什么正常輸出中文沒(méi)有亂碼,zip函數(shù)之后出現(xiàn)中文編程unicode編碼的問(wèn)題,我是遍歷輸出的啊。7. javascript - js中向下取整8. android - 用textview顯示html時(shí)如何寫(xiě)imagegetter獲取網(wǎng)絡(luò)圖片9. 對(duì)mysql某個(gè)字段監(jiān)控的功能10. html - vue項(xiàng)目中用到了elementUI問(wèn)題
