提到Java并發(fā)就會想到鎖纪挎,面試中常問的就是Java常用的鎖期贫。目前最主要的兩鎖就是synchronized 和 ReentrantLock,談?wù)勊麄冇惺裁磪^(qū)別异袄。
功能區(qū)別
基本意義:Synchronized是Java語言的關(guān)鍵字通砍,因此Synchronized的鎖是原生語法層面的互斥,需要JVM來實現(xiàn)烤蜕。具體是通過對象內(nèi)部的一個叫做監(jiān)視器鎖(monitor)來實現(xiàn)的封孙。ReentrantLock,字面意思可重入鎖讽营,它是JDK1.5之后提供的API層面的互斥鎖虎忌,鎖的功能主要由2個方法完成,即lock()和unlock()橱鹏。
易用性:Synchronized的使用比較方便簡潔膜蠢,由編譯器去保證鎖的加鎖和釋放,而ReentrantLock需要手動寫代碼來加鎖和釋放鎖莉兰。
注意:為避免忘記手工釋放鎖而造成了死鎖挑围,最好在finally中聲明釋放鎖。
靈活度:ReentrantLock要優(yōu)于Synchronized糖荒,可以靈活控制在哪個位置加鎖和解鎖杉辙。
性能區(qū)別
我們平時寫代碼的時候用到Java最多的鎖是Synchronized,單例模式中看到的鎖也是Synchronized捶朵。這是為什么呢蜘矢?除了Synchronized使用方面一些,其實和ReentrantLock對比泉孩,性能也絲毫不遜色硼端,這里面說的當(dāng)然是JDK1.5以后的版本了。
JDK1.6以前的版本沒有優(yōu)化寓搬,這時和ReentrantLock比肯定差很多珍昨。優(yōu)化以后的Synchronized引入了包括偏向鎖,輕量級鎖等句喷,這樣就和ReentrantLock性能差不多太多了镣典。
總結(jié)
綜合來看,在兩種方法都可用的情況下唾琼,建議使用synchronized兄春。